如何使用 Laravel 5.3 注销并重定向到登录页面?

Posted

技术标签:

【中文标题】如何使用 Laravel 5.3 注销并重定向到登录页面?【英文标题】:How to logout and redirect to login page using Laravel 5.3? 【发布时间】:2017-02-28 02:11:18 【问题描述】:

我正在使用 Laravel 5.3 并尝试实现身份验证系统。我使用php artisan 命令make:auth 来设置它。我根据我的布局编辑了视图并将其重定向到我的仪表板页面而不是主页(在设置中设置为默认值)。现在,当我尝试注销时,它会抛出这个错误

NotFoundHttpException in RouteCollection.php line 161

我在 routes/web.php 中的代码是:

Auth::routes();

Route::get('/pages/superadmin/dashboard', 'HomeController@index');

HomeController.php

<?php

 namespace App\Http\Controllers;

 use Illuminate\Http\Request;

 class HomeController extends Controller
 
/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()

    $this->middleware('auth');


/**
 * Show the application dashboard.
 *
 * @return \Illuminate\Http\Response
 */
public function index()

    return view('dashboard');


身份验证/登录控制器.php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller

/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/

use AuthenticatesUsers;

/**
 * Where to redirect users after login.
 *
 * @var string
 */
protected $redirectTo = '/dashboard';

/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()

    $this->middleware('guest', ['except' => 'logout']);


我尝试了此页面上的解决方案:How to set laravel 5.3 logout redirect path? 但它不起作用并显示这些错误:

 ReflectionException in Route.php line 339:
 Class App\Http\Controllers\Auth\Request does not exist

我想将它重定向到 auth/ 文件夹中的登录页面。

【问题讨论】:

【参考方案1】:

我终于通过在我的 LoginController.php 中添加这一行来解决这个问题

 protected $redirectAfterLogout = 'auth/login';

并编辑此文件 \vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php 如果您未在此文件中提供 $redirectAfterLogout,它将使用默认的“/”。你也可以在 github 上找到它。链接在答案的末尾。

public function logout()
 
  return redirect(property_exists($this, 'redirectAfterLogout') ? $this- >redirectAfterLogout : '/');

你也可以在这里查看:https://github.com/laravel/framework/commit/aa1204448a0d89e2846cbc383ce487df6efd9fc8#diff-b72935cc9bfd1d3e8139fd163ae00bf5

希望对某人有所帮助。

谢谢

【讨论】:

一个问题是,如果你使用 git,vendor 文件夹不受版本控制,所以你可以将注销功能的内容复制到 LoginController,然后当你注销时它会转到那里供应商包中的文件夹 我强烈建议不要编辑供应商文件。我将在下面发布我的解决方案。【参考方案2】:

如果你想继续使用GET方式退出

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

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

【讨论】:

【参考方案3】:

在 Laravel 5.4 中测试

我认为效果最好的解决方案是覆盖从 app/Http/Controllers/Auth/LoginController.php 文件中调用的继承的“注销”方法。通过向这个类添加以下方法来做到这一点:

/**
 * Log the user out of the application.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function logout(Request $request)

    $this->guard()->logout();

    $request->session()->flush();

    $request->session()->regenerate();

    return redirect('/login');

由于“LoginController”类继承自 Illuminate\Foundation\Auth\AuthenticatesUsers,您应该能够安全地覆盖此方法(在 LoginController 中),而无需编辑实际的供应商文件本身...如果您想升级,编辑 AuthenticatesUsers 文件或 任何 供应商文件会导致严重的麻烦......

这里唯一的额外步骤是您需要在 LoginController 类的顶部包含以下行:

use Illuminate\Http\Request;

【讨论】:

【参考方案4】:

在 Laravel 5.3 中 logouthttp post 而不是 http get。您可以通过发布请求注销,例如 Taylor Otwell 在 auth 脚手架中所做的。

<a href=" url('/logout') "
    onclick="event.preventDefault();
             document.getElementById('logout-form').submit();">
    Logout
</a>

<form id="logout-form" action=" url('/logout') " method="POST" style="display: none;">
     csrf_field() 
</form>

【讨论】:

【参考方案5】:

将注销操作重定向到登录页面对我来说意味着除非用户通过身份验证,否则站点中没有可用的页面。

我不喜欢触摸上面建议的 vendor 目录。确实,Laravel 5.4 vendor/laravel/framework/src/Illuminate/Foundation/Auth/AutenticateUser-&gt;logout() 重定向到 '/'。没有可用于更改它的参数。所以让我们保持这种方式,只需在路由“/”(home)中添加一个“身份验证保护”

/routes/web.php 中添加 Route::get('/', function () return view('home'); )-&gt;middleware('auth');

这不是最简单的方法吗?

【讨论】:

【参考方案6】:

适用于 laravel 5.6 文件 => app/Http/Controllers/Auth/LoginController.php

use Illuminate\Http\Request;

class LoginController extends Controller

    ...  ...  ...
    ...  ...  ...
    ...  ...  ...

    /**
     * Log the user out of the application.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */

    public function logout(Request $request)
    
         $this->guard()->logout();
         $request->session()->flush();
         $request->session()->regenerate();
         return redirect('/login');
    

感谢The Virtual Machinist 的answer。

【讨论】:

以上是关于如何使用 Laravel 5.3 注销并重定向到登录页面?的主要内容,如果未能解决你的问题,请参考以下文章

如果会话过期,如果没有活动并重定向登录页面,则烧瓶注销

用户登录并重定向到主页后,如何在主页导航栏中隐藏登录链接并显示注销链接?

如何从 ui5 应用程序注销并重定向到另一个 ui5 应用程序登录?

在 Flutter 中使用 Firebase/Google 登录时无法注销并重定向到 LoginPage

如何使用获取参数将 laravel (5.3) 路由重定向到其他路由

单击注销按钮终止会话并重定向到登录页面