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

时间:2016-09-05 09:51:25

标签: php laravel laravel-5.3

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

被调用的函数来自特征 AuthenticatesUsers

package columnstofit;

import java.awt.AWTException;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;

    /**
    * FXML Controller class
    */
    public class PersonTableController {

        // Reference to the main application.
        private MainApp mainApp;

        @FXML
        private TableColumn<MainApp.Person, String> firstNameColumn;
        @FXML
        private TableColumn<MainApp.Person, String> lastNameColumn;
        @FXML
        private TableView                    tableView;

        public PersonTableController() throws AWTException {
        }

        public void setMainApp(MainApp mainApp) {
            this.mainApp = mainApp;
            tableView.setItems(mainApp.getPersonData());
            if(mainApp.primaryStage.isShowing())
                MainApp.GUIUtil.fitColumns(tableView);
            else {
                mainApp.primaryStage.showingProperty().addListener((obs, oldVal, newVal) -> {
                    if(newVal)
                        MainApp.GUIUtil.fitColumns(tableView);
                });
            }
        }

        @FXML
        private void initialize() throws AWTException {
            // Initialize the person table with the two columns.
            firstNameColumn.setCellValueFactory(
                    cellData -> cellData.getValue().firstNameProperty());
            lastNameColumn.setCellValueFactory(
                    cellData -> cellData.getValue().lastNameProperty());
        }
    }

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

在一篇文章中解决了这些问题: https://codeneverlied.com/how-to-set-logout-redirect-path-in-laravel-5-8-and-before/

18 个答案:

答案 0 :(得分:46)

这就是我做的。在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原则(不要重复自己)并尽可能多地重复使用代码。

答案 1 :(得分:21)

Laravel> 5.7

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

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

答案 2 :(得分:10)

我会继承LoginController并覆盖来自该特征的logout函数:

LoginController.php - &gt;保持原样。

<强> 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路线。

答案 3 :(得分:6)

我正在使用 Laravel-5.2 ,我使用的是:

public function logout()
{
    Auth::logout();
    Session::flush();
    return redirect('/');
}

确保您已导入:

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

在您的控制器中。

答案 4 :(得分:3)

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

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

它应该可以正常工作并将您重定向到&#39; /&#39;在LoginController.php中定义的目录

引自: -

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

答案 5 :(得分:2)

每次注销操作都会触发事件bool fileExists = File.Exists(System.Web.HttpContext.Current.Server.MapPath("~/"+ icon)); icon_src = "<img src='" + fileExists ? icon : icon.Replace(".jpg", ".jpeg") + "' width='331px' height='381px' /> </figure>"; 。您可以创建一个侦听此事件的侦听器,并向其中添加一些逻辑。在此处查看有关听众的更多信息https://laravel.com/docs/5.3/events

答案 6 :(得分:2)

最简单的方法是覆盖LoginControllerApp\Http\Controllers\Auth\LoginController的注销特征,如下所示

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

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

答案 7 :(得分:2)

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

在LoginController.js中添加这一行

public function logout()
{
    Auth::logout();
    return redirect()->to('/your-route');
}

这假定您正在使用laravel提供的现成的身份验证模块

答案 8 :(得分:1)

只需在routes / web.php

中使用它
Route::get('logout', function (){
Auth::logout();
return redirect('your URL');
});

答案 9 :(得分:1)

Illuminate支持软件包:覆盖LoginController.php中的注销方法

 use Illuminate\Support\Facades\Auth;

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

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

答案 10 :(得分:1)

如果您使用现成的AuthController,请将此变量添加到顶部,然后将字符串更改为重定向到您想要的任何位置。

protected $redirectAfterLogout = '/';

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

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

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

答案 11 :(得分:0)

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

  • Auth / LoginController 中添加自定义注销路由,然后调用 Auth::logout()并返回重定向到您的路径,或
  • 在 -middleware之后添加(比如 redirectAfterLogout )并将其添加到注销路线

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

如果我们查看基于AuthenticatesUsers特征(位于laravel 7的vendor / laravel / ui / auth-backend / AuthenticatesUsers下的Laravel的默认注销功能)的代码,我们将看到用于重定向的硬编码路径。这意味着我们需要从源代码更改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');
}

答案 14 :(得分:0)

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

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

答案 15 :(得分:0)

我刚刚将一个旧网站更新到 Laravel 5.3。这包括按照 Laravel Github 中的建议从 upgrade guide 添加 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 月)

答案 16 :(得分:-1)

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');;
}

答案 17 :(得分:-2)

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