拉拉维尔 5 身份验证注销不起作用


Laravel 5 Auth logout not working

当我使用内置身份验证并尝试在/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();