Laravel 5 Auth注销无法正常工作

时间:2015-02-26 16:23:19

标签: php laravel

当我使用内置身份验证并尝试在/auth/logout注销用户时 - 它无法正常工作。它似乎让用户保持登录状态。但是当我清除浏览器缓存时,我发现实际上已经将用户注销了。

我不会在页面上出现任何错误,也不会在日志文件中出现错误。

我猜测登出方法Session::flush()可能会解决这个问题 - 但我不知道该把它放在哪里。有人可以指出我正确的方向吗?

14 个答案:

答案 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方法已经存在并且运行正常。

这是实际代码

应用程序/ HTTP / routes.php文件

Route::get('auth/logout', 'Auth\AuthController@getLogout');

应用程序/ HTTP /控制器/认证/ AuthController.php

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();