如果删除状态,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';
如果用户拥有status
或0
,则可以提出一个论点,即您不应该让用户登录,而这只需覆盖登录逻辑即可。我个人不使用 Laravel 的默认身份验证逻辑,因此我无法就该方法提供建议,但它应该是一种选择。
【讨论】:
只是为了补充这个答案,当它说“如果用户的状态为 0,你不应该让用户登录”,在文档中有一个示例,您只需更改 @ 987654328@ 到'status' => 1
Specifying Additional Conditions
@porloscerrosΨ 我实际上会添加它作为自己的答案;在该实例中阻止登录似乎更合乎逻辑,而不是经历登录、检查属性、强制注销的麻烦。我只是实际上并不知道默认身份验证的方法。我几乎所有项目都使用自定义版本的 Sentinel 身份验证。
恕我直言authenticated()
方法可以用来代替redirectTo()
。 link以上是关于如果删除状态,Laravel 强制用户注销的主要内容,如果未能解决你的问题,请参考以下文章