如果删除状态,Laravel 强制用户注销

Posted

技术标签:

【中文标题】如果删除状态,Laravel 强制用户注销【英文标题】:Laravel force user to logout if deleted status 【发布时间】:2020-03-18 23:28:08 【问题描述】:

当用户的status 标志值为0 时,我试图在登录过程中强制注销。

这是我的登录代码:

class LoginController extends Controller

    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    //protected $redirectTo = '/landlords/dashboard';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    
        $this->middleware('guest')->except('logout');
    

    protected function redirectTo()
    
        $user=Auth::user();
        if($user->account_type == 1)
            return '/t/dashboard';
        elseif($user->account_type==2)
            return '/l/dashboard';
         else 
            return '/a/dashboard';
        
    

看起来Auth::user() 推断他们已经登录。如果他们有$user->status == 0,我如何继续注销经过身份验证的用户并重定向到/login

【问题讨论】:

【参考方案1】:

为了补充@Tim Lewis的答案,如果没有状态== 1,您还可以避免用户登录,除了用户的电子邮件和密码之外,还可以在身份验证查询中添加一个额外的条件。 Specifying Additional Conditions

public function authenticate(Request $request)

    if (Auth::attempt(['email' => $email, 'password' => $password, 'status' => 1])) 
        // all ok, you can redirect the user
    


更新

您还可以创建一个中间件来检查已登录用户中的该字段,以防状态更改时用户已经登录:

artisan make:middleware CheckStatus

然后在\app\http\Kernel.php$routeMiddleware 数组中,添加:

//you can change checkStatus to canBeLogued, or whatever you want, I'm not good it english at all
'checkStatus' => \App\Http\Middleware\CheckStatus::class,

然后在\app\http\Middleware\CheckStatus.php 中,handle 方法中是这样的:

if(Auth::check() && Auth::User()->status == 0)
     Auth::logout();
     return redirect()->to('/login')->with('warning', 'Your session has expired because your status change.');

return $next($request);

然后,将该中间件应用于您想要的路由。如果它适用于所有路由,您可以在 web.php 中执行类似的操作

Route::group(['middleware' => 'checkStatus'], function () 
    //all your protected routes
);

【讨论】:

可以通过覆盖credentials方法来实现这一点:protected function credentials(Request $request) return $request->only($this->userName(), 'password') + ['status' => 1]; 这应该是公认的答案。登录后重定向是一种资源浪费,并且可能涉及安全问题。如果status 标志为0,则用户不应该能够登录。否则,您正在登录用户,检查标志,然后注销用户。一个非常糟糕的做法。 Auth::attempt(['email' => $email, 'password' => $password, 'status' => 1]) 可能无法向用户显示他具有有效凭据但不是活动状态。相反,它总是会说invalid credentials。登录后方法对用户来说是有意义的。 @ab.in 你是对的,如果失败的是凭据或状态,它将无法向用户显示特定消息,我想你也可以将消息从“这些凭据执行”更改为不符合我们的记录。在resources/lang/en/auth.php 上“这些凭据与我们的记录不匹配,或者您的状态不允许您登录”。我认为您可以添加该方法作为答案。 通过授权策略的方法也可能很有趣。必须研究一下如何针对这种特殊情况实施它,但我刚刚找到它并分享它仅供参考laravel.com/docs/6.x/authorization#policy-responses【参考方案2】:

您可以在redirectTo() 中简单地检查$user

protected function redirectTo()
  $user = auth()->user();

  if($user->status == 0)
    auth()->logout();
    return '/login';
  

  if($user->account_type == 1)
    return '/t/dashboard';
   else if($user->account_type==2)
    return '/l/dashboard';
   else 
    return '/a/dashboard';
  

如果用户拥有status0,则可以提出一个论点,即您不应该让用户登录,而这只需覆盖登录逻辑即可。我个人不使用 Laravel 的默认身份验证逻辑,因此我无法就该方法提供建议,但它应该是一种选择。

【讨论】:

只是为了补充这个答案,当它说“如果用户的状态为 0,你不应该让用户登录”,在文档中有一个示例,您只需更改 @ 987654328@ 到 'status' => 1 Specifying Additional Conditions @porloscerrosΨ 我实际上会添加它作为自己的答案;在该实例中阻止登录似乎更合乎逻辑,而不是经历登录、检查属性、强制注销的麻烦。我只是实际上并不知道默认身份验证的方法。我几乎所有项目都使用自定义版本的 Sentinel 身份验证。 恕我直言authenticated() 方法可以用来代替redirectTo()。 link

以上是关于如果删除状态,Laravel 强制用户注销的主要内容,如果未能解决你的问题,请参考以下文章

Rails设计gem:强制注销浏览器选项卡关闭

关于JWT用户主动注销强制登出忘记密码修改密码的一些思考

用户从Laravel 5.2中的帐户删除后没有注销的原因

Laravel 身份验证会话超时

Laravel:从应用程序中注销/清除所有用户的所有会话

在 laravel 护照中注销用户