如何设置 laravel 5.3 注销重定向路径?

Posted

技术标签:

【中文标题】如何设置 laravel 5.3 注销重定向路径?【英文标题】:How to set laravel 5.3 logout redirect path? 【发布时间】:2017-01-12 16:04:15 【问题描述】:

在 Laravel 5.3 中退出后,是否没有优雅的解决方案可以重定向到特定页面?

被调用的函数来自特征AuthenticatesUsers

public function logout(Request $request)

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

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

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

    return redirect('/');

这是来自 laravel 核心的默认函数。所以我必须覆盖我无法编辑核心的整个功能。 但是没有更简单的解决方案吗,因为手动注销、刷新和重新生成感觉有点矫枉过正。

在一篇文章中得出了答案: https://codeneverlied.com/how-to-set-logout-redirect-path-in-laravel-5-8-and-before/

【问题讨论】:

你想做什么改变? return redirect()->route('yourroute'); 我希望我可以在我的 LoginController 中设置一些简单的东西,比如 protected $logoutRedirectPath = 'my/path/'; 但是注销方法应该是 return property_exists($this, 'logoutRedirectPath') ? $this->logoutRedirectPath : '/'; 你应该可以使用这样的东西 - ***.com/questions/29797433/… @AndyHolmes 我希望这样做,但这在 5.3 中不再适用。查看正在调用的方法。 【参考方案1】:

我刚刚将一个旧网站更新到 Laravel 5.3。这包括按照upgrade guide 中的建议从Laravel Github 添加4 个新的Auth 控制器。

三个新的控制器:RegisterController.php、LoginController.php 和 ResetPaswordController.php 都包含一个代码块

/**
 * Where to redirect users after resetting their password.
 *
 * @var string
 */
protected $redirectTo = '/home';

只需将 /home 更改为所需的重定向位置。至少在 Laravel 5.3 中这对我有用(数据 2021 年 4 月)

【讨论】:

【参考方案2】:

在我的情况下,我希望它在注销后将用户重定向到主页'/home',但它一直将他重定向到登录页面 原因是默认的HomeController使用了auth中间件

我不得不从 __construct 方法中删除这一行 $this->middleware('auth');

【讨论】:

【参考方案3】:

如果我们查看 Laravel 在 AuthenticatesUsers trait 上的默认注销功能代码(对于 laravel 7,它位于 vendor/laravel/ui/auth-backend/AuthenticatesUsers 下),我们将看到用于重定向的硬编码路径。这意味着我们需要从源代码更改 url,但是通过供应商编辑文件是错误的方式,但是特性为我们提供了一种更好的方式,我们可以覆盖代码所以只需将所有注销功能的代码粘贴到 LoginController 页面并更改redirect('/') 函数的参数到你想要的任何 url。 目前我的代码看起来就像那些只是把它放在 LoginController 上:

/**
 * 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()->invalidate();

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

    if ($response = $this->loggedOut($request)) 
        return $response;
    

    return $request->wantsJson()
        ? new Response('', 204)
        : redirect('/login');

【讨论】:

【参考方案4】:

Illuminate Support 包:覆盖 LoginController.php 中的注销方法

 use Illuminate\Support\Facades\Auth;

 public function logout()
     
         Auth::logout();

     return redirect('/wherever/you/want');
 

【讨论】:

【参考方案5】:

假设有人现在正在查看它,并且他们使用的 laravel 版本是 5.7

在 LoginController.php 中添加这一行

public function logout()

    Auth::logout();
    return redirect()->to('/your-route');

这假设您使用的是 laravel 提供的开箱即用的身份验证模块

【讨论】:

别忘了添加Auth类,使用Auth; 在 Laravel 6.7 确认【参考方案6】:

Laravel 5.8 中找到以下路径:

App\Http\Controllers\Auth\LoginController.php

use Illuminate\Http\Request;*

编写这个函数

public function logout(Request $request)
    $this->guard()->logout();

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

    return $this->loggedOut($request) ?: redirect('/Where/You/want/to/redirect');;

【讨论】:

不要更改供应商文件夹中的文件。当您运行 composer update 时,此更改将消失。这不是一个好的解决方案。 谢谢蒂姆·范乌姆。现在我发布了一个新答案。【参考方案7】:

Laravel > 5.7

接受的答案很好,但您可以完全绕过任何注销逻辑,只需覆盖loggedOut 方法:

// App\Http\Controllers\Auth\LoginController.php
protected function loggedOut(Request $request) 
    return redirect('/where/ever/you/want/to/go');

【讨论】:

不用担心。只是对源代码进行了一些挖掘 也适用于 5.6 你好,请问我应该在哪个文件中覆盖这个方法? 可能是这里唯一正确的答案!确保Request命名空间包含在Controller中,即:use Illuminate\Http\Request; @Hatef 这对 laravel 5.7+ 有好处,但问题是 laravel 5.3,其中这个答案是错误的。但在这里提一下还是不错的,因为很多人最终会来到这里。【参考方案8】:

接受的答案很好,但您可以通过简单地覆盖loggedOut方法来完全绕过任何注销逻辑:

protected function loggedOut(Request $request) 
    return redirect('/where/ever/you/want/to/go');

【讨论】:

【参考方案9】:

只需在 routes/web.php 中使用它

Route::get('logout', function ()
Auth::logout();
return redirect('your URL');
);

【讨论】:

【参考方案10】:

为避免重复注销代码并遵循 DRY,您可以

Auth/LoginController中添加自定义注销路由,调用 Auth::logout() 并返回重定向到您的路径,或者 添加一个after-middleware(比如redirectAfterLogout)并将其添加到注销路由中

【讨论】:

【参考方案11】:

如果您使用的是开箱即​​用的 AuthController,请将此变量添加到顶部,然后更改字符串以重定向到您想要的任何位置。

protected $redirectAfterLogout = '/';

AuthenticatesUsers 类有一个注销函数来检查这个变量。

public function logout()

        Auth::guard($this->getGuard())->logout();

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

【讨论】:

【参考方案12】:

laravel 5.3 中的 Auth::routes 方法为 /logout 注册了一个 POST 路由,而不是一个 GET 路由。这可以防止其他 Web 应用程序将您的用户从您的应用程序中注销。要升级,您应该将您的注销请求转换为使用 POST 动词,或者通过将此路由添加到文件 Routes/web.php 来为 /logout URI 注册您自己的 GET 路由:-

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

它应该可以正常工作并将您重定向到 LoginController.php 中定义的“/”目录

引自:-

https://laravel.com/docs/5.3/upgrade

【讨论】:

谢谢,这很有帮助【参考方案13】:

我用的是Laravel-5.2,我用的是:

public function logout()

    Auth::logout();
    Session::flush();
    return redirect('/');

确保您已导入:

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;

在您的控制器中。

【讨论】:

我很害怕。我认为它非常丑陋。应该可以使用 protected $logoutRedirectPath = 'path'; 之类的东西向 LoginController(5.2 中的 AuthController)添加一个属性 感谢您的回答。如果可能的话,我可以知道它的来源(或者如果你记得吗?),为你 +1 我的朋友 @IslamElshobokshy 抱歉,我现在不记得了,因为已经有好几年了 :)【参考方案14】:

我就是这样做的。在 Auth\LoginController 你有:

use AuthenticatesUsers;

改成:

use AuthenticatesUsers 
    logout as performLogout;

然后,在你的 LoginController 中定义一个新的 logout() 方法:

public function logout(Request $request)

    $this->performLogout($request);
    return redirect()->route('your_route');

当然,该特征中的常规 logout() 方法只有 3 行(用于将用户从系统中注销),因此您可以将它们复制到您的方法中,但您应该始终遵循 DRY 原则(不要重复自己) 并尽可能多地重复使用代码。

【讨论】:

嗨@avram,我对use … … as … 中的语法有疑问。它看起来有点像导入/解构。你知道这个语法/模式的名称是什么吗?感谢您的帮助,它适用于我正在进行的项目! @meduz' 我不太清楚它是怎么调用的,我刚刚在 PHP 文档中找到了它:php.net/manual/en/… 唯一没有提到的是在LoginController中包含use Illuminate\Http\Request;【参考方案15】:

你可以去vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php 在函数logout 中将return redirect('/'); 更改为您的路由地址。

【讨论】:

这是非常糟糕的做法!如果您运行composer update,您的更改就消失了。切勿更改供应商文件夹中的文件。【参考方案16】:

最简单的方法是像这样在App\Http\Controllers\Auth\LoginController 中覆盖LoginController 的注销特征

public function logout(Request $request)
    $this->guard()->logout();
    $request->session()->flush();
    $request->session()->regenerate();

    return redirect()->route('you_route_name');

【讨论】:

想知道为什么你只有 3 票,最聪明和最聪明的选择。【参考方案17】:

我会继承 LoginController 并覆盖来自那里的 trait 的 logout 函数:

LoginController.php -> 保持原样。

MyLoginController.php

class MyLoginController extends LoginController 

protected $redirectAfterLogout = '/goodbye';

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

当然,您应该记得相应地更新您的 Auth 路由。

【讨论】:

已经在使用这个了。但是不需要扩展 LoginController,因为控制器是开放的,可以修改。只需将方法添加到 LoginController。因为该方法位于 LoginController 中使用的特征中。这似乎是解决方案,没有在事件内触发重定向,因此事件不是一个选项 你是对的,在 LoginController 本身中定义 logout 覆盖是非常好的,我只是想将没有“内置”的东西保存在我自己的单独文件中。 在 laravel 5.3 中就像一个魅力,但你可以直接编辑 LoginController 并覆盖注销方法 - 无论如何,如果它能够像成功登录后的重定向那样实现会很好 @Kaloyan Doichinov,看来你是 laravel 大师。我需要你帮忙。看这里:***.com/questions/41047583/…【参考方案18】:

每个注销操作都会触发一个事件Events\Logout。您可以创建一个侦听器来侦听此事件并在其中添加一些逻辑。在此处查看有关听众的更多信息https://laravel.com/docs/5.3/events

【讨论】:

发现事件并触发。但是有些东西使它无法重定向。在事件中我有return redirect()->route('admin::login');,但它没有被触发。事件至少会更干净一些。同样使用普通的header('Location: /'); 也不起作用。

以上是关于如何设置 laravel 5.3 注销重定向路径?的主要内容,如果未能解决你的问题,请参考以下文章

登录和注销后如何重定向 - laravel 5

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

laravel 路由重定向问题(laravel 5.3)

在 Laravel 5.3 中重定向路由

注销重定向到管理仪表板 laravel

Laravel 5.5 Ajax 注销没有重定向