拉拉维尔:如果活动中间件返回假,我无法与其他用户登录,直到删除cookie



我有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语句。您还可以考虑在重定向之前将用户注销。

相关内容

最新更新