我有isActive中间件,当用户不活动时,我将1设置为活动,将0设置为0。
isActive.php inMiddleware folder look like this:
namespace AppHttpMiddleware;
use Closure;
use IlluminateSupportFacadesAuth;
class IsActive
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (Auth::check()) {
if (Auth::user()->isActive()) {
return $next($request);
}
}
return redirect('/')->with('nonActive', 'Account is not active');
}
}
我在用户模型中有方法:
public function isActive()
{
if ($this->is_active == 1) {
return true;
}
return false;
}
在受保护的$routeMiddleware中的Kernel.php中,我添加了以下内容:
'is.active' => AppHttpMiddlewareIsActive::class,
我在路由中有组中间件,所有这些都很好。
但是,当isActive中间件返回false时,我无法使用不同的用户登录。在我删除cookie之前,总是得到return false,就好像该用户也处于非活动状态一样。删除后,我可以登录刚刚好的用户是活跃的。
您的路由组:
Route::group(['middleware' => 'auth'], function () {
// your active and auth user routes
});
如果您希望用户处于活动状态以进行身份验证,请在用户模型中使用全局范围:
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentBuilder;
class User extends Model
{
...
protected static function boot()
{
parent::boot();
static::addGlobalScope('isactive', function (Builder $builder) {
$builder->where('is_active', '=', 1);
});
}
...
}
这样,除非用户处于活动状态,否则不会找到用户,并且您不需要IsActive中间件。
来源:https://laravel.com/docs/5.7/eloquent#global-示波器
要自定义身份验证失败错误,请覆盖LoginController
中的sendFailedLoginResponse
protected function sendFailedLoginResponse(Request $request)
{
return redirect('/')->with('nonActive', 'Account is not active');
}
如果Auth::check((返回false,则不要重定向。。
改变你的逻辑:
if (Auth::check()) {
if (!Auth::user()->isActive()) {
return redirect('/')->with('nonActive', 'Account is not active');
}
}
return $next($request);
您也可以将其简化为一个if语句。您还可以考虑在重定向之前将用户注销。