当我使用内置身份验证并尝试在/auth/logout
注销用户时 - 它无法正常工作。它似乎让用户保持登录状态。但是当我清除浏览器缓存时,我发现实际上已经将用户注销了。
我不会在页面上出现任何错误,也不会在日志文件中出现错误。
我猜测登出方法Session::flush()
可能会解决这个问题 - 但我不知道该把它放在哪里。有人可以指出我正确的方向吗?
答案 0 :(得分:51)
对于任何使用已接受的解决方案解决问题的人:我从Laravel 5.1开始并更新到5.2。以下修复对我有用:
尝试更改您的退出'路线到
Route::get('auth/logout', 'Auth\AuthController@logout');
或在AuthController构造函数中添加
public function __construct()
{
$this->middleware('guest', ['except' => ['logout', 'getLogout']]);
}
取自:https://stackoverflow.com/a/34667356/1275778(如果您之后仍然遇到问题,还要检查其他答案)
答案 1 :(得分:11)
试试这个..
放入以下代码" 类AuthController扩展控制器"
public function getLogout()
{
$this->auth->logout();
Session::flush();
return redirect('/');
}
答案 2 :(得分:7)
我遇到了同样的问题。 问题实际上是路由和控制器配置中的一个简单的小错误。
您看到路由实际上指定了getLogout
的方法,并且控制器异常正在寻找logout
。
您唯一需要做的就是更改控制器中的异常。无需任何其他方法。 getLogout
方法已经存在并且运行正常。
这是实际代码
Route::get('auth/logout', 'Auth\AuthController@getLogout');
public function __construct()
{
$this->middleware($this->guestMiddleware(), ['except' => 'logout']);
}
_construct
方法看起来应该是这样的:
public function __construct()
{
$this->middleware($this->guestMiddleware(), ['except' => 'getLogout']);
}
答案 3 :(得分:3)
这个因为每条路线都要调用中间件。你可以为"添加例外退出路线"在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);
}
}
答案 4 :(得分:2)
我对更新的laravel 5.2遇到了同样的问题。我使用了laravel的auth控制器,我用like,
解决了这个问题 对于/logout
和/auth/logout
而言,{p> /register
代替/login
而不是/auth/register
和/auth/login
。
答案 5 :(得分:2)
Laravel 5.2网址有点不同......
使用此
php artisan make:auth
这将生成auth的路由和登录e register的一些模板......
小心将它用于现有项目,它可以对代码进行更改
答案 6 :(得分:2)
要在laravel 5.6中注销:
在您的视图页面中使用:
<a href="{{ url('logout') }}">Logout</a>
在您的web.php中使用它
Route::get('logout', 'Auth\LoginController@logout');
答案 7 :(得分:1)
在崩溃后恢复标签的浏览器上不够(Chrome doesn't delete session cookies)。此外,重定向后,将创建一个新会话。解决方案:在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重定向重新初始化Session。所以重定向后,在视图中,重置删除cookie。有人可以对此发表评论吗?这是正确的原因吗?
答案 8 :(得分:0)
使用内置身份验证工具注销Laravel用户,就像使用Auth::logout();
一样简单。
如果会话行为不可预测,请检查config/session.php
中的各种会话设置。
答案 9 :(得分:0)
解决方案非常简单
在Http-&gt;中间件 - &gt; Authenticate.php更改&#34;登录&#34; in else语句到&#34; /&#34;
返回redirect() - &gt;来宾(&#39; /&#39;);
并在routes.php中定义以下路由
Route::get('/', function () {
return view('login');
});
用于退出调用以下功能: public function getlogout(){ \验证::注销(); 返回重定向(&#39; / home&#39;); } 这很重要 重定向到&#34; / home&#34;而不是&#34; /&#34;首先调用$ this-&gt;中间件(&#39; auth&#39;); 然后在中间件中重定向到&#34; /&#34;
答案 10 :(得分:0)
升级到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
开始正常工作。
答案 11 :(得分:0)
在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>
答案 12 :(得分:0)
如果没有任何解决方案,请尝试以下操作
如果您使用auth()->logout
,则需要多个自定义防护,那么它将无法正常工作
只需使用auth('your-guard-name')->logout();
,它就可以正常工作。
答案 13 :(得分:-1)
这是一个非常古老的线程,但最后我找到了一个简单的技巧来将用户从服务器中注销:
return Auth::logout();