【问题标题】:Laravel 5 Auth logout not workingLaravel 5 Auth注销不起作用
【发布时间】:2015-04-29 03:06:51
【问题描述】:

当我使用内置身份验证并尝试在/auth/logout 注销用户时 - 它无法按预期工作。它似乎使用户保持登录状态。但是当我清除浏览器缓存时,我可以看到它实际上已将用户注销。

页面上没有任何错误,日志文件中也没有错误。

我猜想注销方法中的Session::flush() 可能会解决这个问题 - 但我不知道把它放在哪里.. 有人能指出我正确的方向吗?

【问题讨论】:

  • 我遇到了同样的问题,我的错误是把中间件“guest”放到了注销路径。 :/ 也许你也有同样的问题。

标签: php laravel


【解决方案1】:

对于任何使用公认解决方案解决问题的人:我从 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(如果之后仍有问题,请查看其他答案)

【讨论】:

  • 谢谢,在许多其他失败的解决方案之后,您的第二个选项立即生效!
  • 这个对我有用,我用的是 5.2,非常感谢 lorey。
  • 这应该是公认的答案。将默认的 $this->middleware('guest', ['except' => ['getLogout']]); 更改为 $this->middleware('guest', ['except' => ['logout', 'getLogout']]); 就可以了。
  • 我刚刚将路线...@getLogout 更改为...@logout,现在一切正常。谢谢
  • 值得一提:注意您的注销路由不是已经实现guest 中间件的路由组的一部分。在这种情况下,它将忽略上述异常。
【解决方案2】:

试试这个..

放入以下代码“class AuthController extends Controller

public function getLogout()
    {
        $this->auth->logout();
        Session::flush();
        return redirect('/');
    }

【讨论】:

  • 我需要更改 Session::flush();到 \Session::flush();但在其他情况下适用于我的情况。
  • @UmairHamid 将该代码(使用 Auth::Logout() 而不是 $this->auth->logout();)放入 AuthController 中的一个新函数(例如,public function logout())中,然后将您的路径指向那里进行身份验证/注销。跨度>
  • 尝试了相同但没有结果
  • 这里也没有运气;但@lorey 的建议对我有用。
【解决方案3】:

我遇到了同样的问题。 问题实际上是路由和控制器配置中的一个简单的小错误。

您看到路由实际上指定了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']);
}

【讨论】:

  • 这行得通。考虑到getLogout 是在Illuminate/Foundation/Auth/AuthenticatesAndRegistersUsers 中调用的方法,所以你必须这样做似乎很奇怪,所以他们应该在AuthController.php 中默认getLogout
【解决方案4】:

发生这种情况是因为每个路由都调用了中间件。您可以在 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);
    }
}

【讨论】:

    【解决方案5】:

    适用于 laravel 5.6 及更高版本的注销:

    在您的查看页面中使用:

        <a href="{{ url('logout') }}">Logout</a>
    

    在你的 web.php 中使用它

    Route::get('logout', 'Auth\LoginController@logout');
    

    【讨论】:

    • 为什么要覆盖默认的get路由?
    • Laravel 默认使用 post 方法注销,我们将其转换为 get。使用此覆盖。你有什么困惑吗?
    • 你说的很有道理,只是想知道为什么它是开箱即用的帖子。
    • 谢谢!多年来一直在寻找这个 - 为什么我们必须使用 get 请求来请求默认的发布请求 - 这让我感到困惑,为什么我们不能直接使用刀片发布到默认的 Auth::logout。
    • 可以使用默认登录,但那不是get方法,是post请求;
    【解决方案6】:

    我在更新 laravel 5.2 时遇到了同样的问题。我使用了 laravel 的身份验证控制器,并使用类似解决了这个问题,

    /logout 而不是 /auth/logout/register/login 相同,而不是使用 /auth/register/auth/login

    【讨论】:

      【解决方案7】:

      Laravel 5.2 的 url 有点不同...

      使用这个

      php artisan make:auth
      

      这将生成用于身份验证的路由和一些用于登录和注册的模板...

      小心在现有项目中使用它,它可以更改您的代码

      【讨论】:

        【解决方案8】:

        在崩溃后恢复标签页的浏览器上还不够 (Chrome doesn't delete session cookies) 。此外,重定向后会创建一个新会话。解决方法:在AuthController中,如前所述,在getLogout中,设置一个变量传给redirect:

        $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。有人可以对此发表评论吗?这是正确的原因吗?

        【讨论】:

          【解决方案9】:

          要使用 Laravel 内置的身份验证工具注销用户,就像使用 Auth::logout(); 一样简单。

          如果会话行为不可预测,请检查 config/session.php 中的各种会话设置。

          【讨论】:

            【解决方案10】:

            解决方法很简单

            在Http->Middleware->Authenticate.php中将else语句中的“login”改为“/”

            return redirect()->guest('/');

            并在 routes.php 中定义以下路由

            Route::get('/', function () {
                return view('login');
            });
            

            注销调用以下函数: 公共函数getlogout(){ \验证::注销(); 返回重定向('/home'); } 这很重要重定向到“/home”而不是“/”,它首先调用 $this->middleware('auth'); 然后在中间件中重定向到“/”

            【讨论】:

              【解决方案11】:

              升级到 Laravel 5.3 后我遇到了同样的问题。为了解决这个问题,我注意到

              中使用的特征

              App\Http\Controllers\Auth\AuthController

              已经过时了,所以我换行了

              use AuthenticatesAndRegistersUsers, ThrottlesLogins;

              进入

              use AuthenticatesUsers;

              还有构造函数中的那一行

              $this-&gt;middleware($this-&gt;guestMiddleware(), ['except' =&gt; 'logout']);

              进入

              $this-&gt;middleware('guest', ['except' =&gt; ['logout', 'getLogout']]);

              然后方法App\Http\Controllers\Auth\AuthController@logout开始正常工作了。

              【讨论】:

                【解决方案12】:

                在 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>
                

                【讨论】:

                  【解决方案13】:

                  如果没有任何解决方案有效,试试这个 对于多个自定义警卫,如果您使用 auth()-&gt;logout 那么它将不起作用 只需使用auth('your-guard-name')-&gt;logout(); 即可。

                  【讨论】:

                    【解决方案14】:

                    这是一个相当古老的线程,但最后我找到了一个简单的技巧来将用户从服务器中注销:

                    return Auth::logout();
                    

                    【讨论】:

                      猜你喜欢
                      • 2015-09-30
                      • 2017-01-07
                      • 2021-01-22
                      • 2017-01-26
                      • 2016-05-17
                      • 2019-07-16
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多