【问题标题】:Logging out via a link in Laravel通过 Laravel 中的链接注销
【发布时间】:2017-08-22 14:16:53
【问题描述】:

我的顶部导航栏中有一个“注销”链接。我想知道如何做到这一点,以便在我登录时,当我点击它并返回主页时,它会注销我。

具体来说,我在 Laravel 中对哪些文件进行了哪些更改?另外,我需要在当前仅包含 HTML 的视图中编写什么代码来触发此操作?

【问题讨论】:

    标签: laravel navbar logout


    【解决方案1】:

    当你运行php artisan make:auth 时,Laravel 5.5 中默认的 app.php 是这样的:

    <a href="{{ route('logout') }}" onclick="event.preventDefault(); document.getElementById('logout-form').submit();">
        Logout
    </a>
    
    <form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
        {{ csrf_field() }}
    </form>
    

    【讨论】:

    • 这是您应该在 Laravel 中注销的正确方法。接受的答案不能防止跨站点请求伪造(尽管注销某人可能不是您最关心的问题,您应该以正确的方式进行操作)。
    • Laravel 5.6 及以上版本可以使用@csrf 替换{{ csrf_field() }}
    • 因为我习惯于在我的应用程序中包含所有形式的 CSRF 令牌,所以我应该不会遇到这种方式应用的困难。不同之处在于我在前端使用 React 和 React Router。但是概念还是一样的
    【解决方案2】:

    于 2019 年 12 月 28 日编辑:可行,但此答案包含严重的安全问题。使用前请三思。 Lucas Bustamante 的答案也许是更好的选择。请参阅此答案的评论部分。

    1) 如果您使用的是 laravel 包含的 auth 脚手架。你可以这样做,在你的导航栏中添加这个:

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

    然后将其添加到您的 web.php 文件中

    Route::get('/logout', '\App\Http\Controllers\Auth\LoginController@logout');
    

    完成。这将注销您并重定向到主页。要获取 auth 脚手架,请从命令行 cd 到您的项目根目录并运行

    php artisan make:auth 
    

    2) 将此添加到您的导航栏:

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

    然后将其添加到您的 web.php 文件中

    Route::get('/logout', 'YourController@logout');
    

    然后在 YourController.php 文件中,添加这个

    public function logout () {
        //logout user
        auth()->logout();
        // redirect to homepage
        return redirect('/');
    }
    

    完成。

    阅读:

    https://mattstauffer.co/blog/the-auth-scaffold-in-laravel-5-2
    https://www.cloudways.com/blog/laravel-login-authentication/
    

    【讨论】:

    • @BenKao 很高兴我能帮上忙。请将答案标记为正确
    • 哇,这是一个很大的禁忌。您应该有一个提交带有 CSRF 令牌字段的发布请求的表单。通过 GET 请求允许注销允许任何网站将您注销!
    • @ColinLaws 我同意这是不可以的,除了您所说的之外,还有另一个原因:某些浏览器在您访问页面时会预先缓存页面上的链接,这可能会导致您获得只需访问带有该链接的页面即可注销。请参阅 stackoverflow.com/a/14587231/2778502
    • @jeff-h 令我惊讶的是,Identity server 4 有一些方法可以做到这一点。这是不相关的,因为这是 Laravel,但我认为找到一种使用 GET 注销的真正方法很有趣。
    • 这对我不起作用,因为此错误此路由不支持 GET 方法。支持的方法:POST。
    【解决方案3】:

    使用logout() 方法:

    auth()->logout();
    

    或者:

    Auth::logout();
    

    要将用户从您的应用程序中注销,您可以使用Auth 门面的logout 方法。这将清除用户会话中的身份验证信息。

    【讨论】:

    • 那么OP就可以加:return redirect('/');
    • 我在 Laravel 中对哪些文件进行了哪些更改?就像我在哪里编写代码 Auth::logout() 并返回 redirect('/')?另请注意,我的“注销”链接必须触发所有这些。注销链接如何触发这些操作?
    【解决方案4】:

    如果你想使用 jQuery 而不是 JavaScript:

    <a href="javascript:void" onclick="$('#logout-form').submit();">
        Logout
    </a>
    
    <form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
        @csrf
    </form>
    

    【讨论】:

      【解决方案5】:

      正如接受的答案提到通过 GET 注销有副作用,你应该使用 Laravel auth 已经创建的默认 POST 路由。

      只需创建一个小表单并通过链接或按钮 HTML 标记提交:

      <form action="{{ route('logout') }}" method="POST">
          @csrf
          <button type="submit">
              {{ __('Logout') }}
          </button>
      </form>
      

      【讨论】:

        【解决方案6】:

        如果你使用guard,你可以使用这行代码注销:

        Auth::guard('you-guard')->logout();
        

        【讨论】:

          【解决方案7】:

          在 laravel 8.x 中

          @csrf
                                  <x-jet-dropdown-link href="{{ route('logout') }}"
                                                      onclick="event.preventDefault();
                                                                  this.closest('form').submit();">
                                      {{ __('Logout') }}
                                  </x-jet-dropdown-link>
                              </form>
          

          【讨论】:

            猜你喜欢
            • 2012-08-01
            • 2015-05-03
            • 2019-12-10
            • 2015-02-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-15
            相关资源
            最近更新 更多