当我使用内置身份验证并尝试在/auth/logout
注销用户时 - 它没有按预期工作。它似乎使用户保持登录状态。但是当我清除浏览器缓存时,我可以看到实际上已经将用户注销了。
中也没有错误。
我猜Session::flush()
注销方法可能会解决这个问题 - 但我不知道把它放在哪里。有人可以指出我正确的方向吗?
对于任何在使用公认的解决方案解决它时遇到问题的人:我从 Laravel 5.1 开始并更新到 5.2。以下修复程序对我有用:
尝试将"注销"路由更改为
Route::get('auth/logout', 'Auth'AuthController@logout');
或在身份验证控制器构造函数中添加
public function __construct()
{
$this->middleware('guest', ['except' => ['logout', 'getLogout']]);
}
取自:https://stackoverflow.com/a/34667356/1275778(如果您之后仍然遇到问题,请检查那里的其他答案(
试试这个。
放入以下代码">类身份验证控制器扩展控制器">
public function getLogout()
{
$this->auth->logout();
Session::flush();
return redirect('/');
}
我遇到了同样的问题。问题实际上是路由和控制器配置中的一个简单的小错误。
您会看到路由实际上指定了getLogout
的方法,并且控制器异常正在查找logout
。
您唯一需要做的就是更改控制器中的异常。无需任何其他方法。getLogout
方法已经存在并且运行良好。
这是实际代码
app/Http/routes.php
Route::get('auth/logout', 'Auth'AuthController@getLogout');
app/Http/Controllers/Auth/AuthController.php
public function __construct()
{
$this->middleware($this->guestMiddleware(), ['except' => 'logout']);
}
_construct
方法应如下所示:
public function __construct()
{
$this->middleware($this->guestMiddleware(), ['except' => 'getLogout']);
}
因为每个路由都调用中间件。 您可以在 App''Http''Middleware''RedirectIfAuthenticated 中的"注销路由"中添加例外.php
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param 'Illuminate'Http'Request $request
* @param 'Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if (!$request->is('/logout') && Auth::guard($guard)->check()) {
return redirect('/home');
}
return $next($request);
}
}
对于在 laravel 5.6 及更高版本中注销:
在视图页面中使用:
<a href="{{ url('logout') }}">Logout</a>
在您的网络中使用它.php
Route::get('logout', 'Auth'LoginController@logout');
我在更新的 larravel 5.2 时遇到了同样的问题。我使用了 laravel 的身份验证控制器,我使用如下方法解决了这个问题,
/logout
而不是/auth/logout
相同的/register
和/login
,而不是使用/auth/register
和/auth/login
。
Laravel 5.2 网址有点不同...
使用这个
php artisan make:auth
这将生成身份验证的路由和一些用于登录的模板 e 注册...
小心将其用于现有项目,它可以更改您的代码
在崩溃后恢复标签页的浏览器上还不够(Chrome 不会删除会话 cookie(。此外,重定向后会创建一个新会话。解决方案:如上所述,在 AuthController 中,在 getLogout 中,设置一个变量并将其传递给重定向:
$data['logout'] = true;
return redirect('/')->with('data',$data);
在主页视图中执行以下操作:
@if(session()->has('data') && session('data')['logout'])
{{session_unset()}}
{{setcookie('laravel_session', "", -1, "/")}}
@endif
我相信 Laravel 重定向重新初始化会话。因此,重定向后,在视图中,重置删除cookie。任何人都可以对此发表评论吗?这是正确的原因吗?
要使用内置的身份验证工具注销带有Laravel的用户,就像使用Auth::logout();
一样简单。
如果会话行为不可预测,请同时检查config/session.php
中的各种会话设置。
解决方案非常简单
在 Http->Middleware->Authenticate.php将 else 语句中的"login"更改为"/">
返回重定向((->来宾('/'(;
并在路由中定义以下路由.php
Route::get('/', function () {
return view('login');
});
对于注销调用以下功能: 公共函数 getlogout(({ ''Auth::logout((; 返回重定向("/家"(; }这很重要,重定向到首先调用$this->中间件('auth'(的"/home"而不是"/";然后在中间件中重定向到"/">
Laravel 5.3后我遇到了同样的问题。为了修复它,我注意到
App'Http'Controllers'Auth'AuthController
过时了,所以我改了线
use AuthenticatesAndRegistersUsers, ThrottlesLogins;
到
use AuthenticatesUsers
;
以及构造函数中的行
$this->middleware($this->guestMiddleware(), ['except' => 'logout']);
到
$this->middleware('guest', ['except' => ['logout', 'getLogout']]);
然后该方法App'Http'Controllers'Auth'AuthController@logout
开始正常工作。
在 5.4 中,这对我有用...
<a href="#" onclick="event.preventDefault(); document.getElementById('logout-form').submit();">Logout</a>
<form id="logout-form" action="/logout" method="POST" style="display: none;">{{ csrf_field() }}</form>
如果没有任何解决方案有效,请尝试此操作对于多个自定义防护,如果您使用auth()->logout
则它不起作用只需使用auth('your-guard-name')->logout();
,它就可以正常工作。
这是一个相当古老的线程,但最后我找到了一个简单的技巧来将用户从服务器注销:
return Auth::logout();