我有一个带有两个函数的自定义LoginController:
运行Auth :: guard('customer')的loginCustomer - >尝试(...);
运行Auth :: guard('employee')的loginEmployee - >尝试(...);
我在config.auth中定制了两个警卫,指向我的两个模型(客户和员工)并保护后台和前端的路由。
现在在我的自定义LogoutController中,我想运行Auth :: logout(),但它不起作用,因为我认为它使用默认的守卫。
只有在我指定 if ($form->isValid()) {
// ... do something
// the save_and_add button was clicked
if ($form->get('approve')->isClicked()) {
// probably redirect to the add page again
}
if ($form->get('reject')->isClicked()) {
// probably redirect to the add page again
}
// redirect to the show page for the just submitted item
}
或Auth::guard('customer')->logout()
时才会有效,具体取决于用于登录的后卫。
有没有办法让警卫用来验证用户,所以我只能使用Auth::guard('employee')->logout()
?
答案 0 :(得分:6)
这可能不是完美的解决方案,但它确实有效。基本上,只需检查所有警卫并检查用户是否通过该警卫进行身份验证。如果他是 - 记录他。请注意,这将使他退出他登录的所有警卫。
此代码将转到您的注销控制器:
$guards = array_keys(config('auth.guards'));
foreach ($guards as $guard) {
if(Auth::guard($guard)->check()) Auth::guard($guard)->logout();
}
答案 1 :(得分:5)
您可以使用shouldUse
方法:
调用此方法后,您可以通过shouldUse
方法之前设置的后卫来注销用户。
在你的情况下:
if( Auth::guard('customer')->attempt(...) ){
Auth::shouldUse('customer');
}
if( Auth::guard('employee')->attempt(...) ){
Auth::shouldUse('employee');
}
在此之后你可以使用Auth :: logout并使用之前选择的后卫(通过shouldUse
):
// just use Auth::logout without Auth::guard(GUARDNAME)->logout()
Auth::logout();
有关此方法的简短文档:https://laravel.com/api/5.4/Illuminate/Auth/AuthManager.html#method_shouldUse