簡體   English   中英

如何設置laravel 5.3注銷重定向路徑?

[英]How to set laravel 5.3 logout redirect path?

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

我就是這樣做的。 在 Auth\\LoginController 你有:

use AuthenticatesUsers;

將其更改為:

use AuthenticatesUsers {
    logout as performLogout;
}

然后,在 LoginController 中定義一個新的logout()方法:

public function logout(Request $request)
{
    $this->performLogout($request);
    return redirect()->route('your_route');
}

當然,該 trait 中的常規logout()方法只有 3 行(用於將用戶從系統中注銷),因此您可以將它們復制到您的方法中,但您應該始終遵循 DRY 原則(不要重復自己)並重新- 使用盡可能多的代碼。

Laravel > 5.7

接受的答案很好,但您可以通過簡單地覆蓋loggedOut方法來完全繞過觸及任何注銷邏輯:

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

我將繼承LoginController並覆蓋來自那里的特征的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 路由。

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

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

確保您已導入:

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

在您的控制器中。

假設有人現在正在查看它,並且他們使用的 Laravel 版本是 5.7

在 LoginController.php 中添加這一行

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

這假設您使用的是 laravel 提供的開箱即用的身份驗證模塊

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

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

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

每個注銷操作都會觸發一個事件Events\\Logout 您可以創建一個偵聽此事件的偵聽器並向其中添加一些邏輯。 在此處查看有關偵聽器的更多信息https://laravel.com/docs/5.3/events

最簡單的方法是重寫注銷特質在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');
}

如果您使用的是開箱即​​用的 AuthController,請將此變量添加到頂部,然后將字符串更改為重定向到您想要的任何位置。

protected $redirectAfterLogout = '/';

AuthenticatesUsers 類具有檢查此變量的注銷函數。

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

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

為避免重復注銷代碼並遵循 DRY,您可以

  • Auth/LoginController 中添加自定義注銷路由,調用Auth::logout()並返回重定向到您的路徑,或
  • 添加after -middleware(比如redirectAfterLogout )並將其添加到注銷路由

接受的答案很好,但您可以通過簡單地覆蓋loggedOut方法來完全繞過觸及任何注銷邏輯:

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

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

Illuminate 支持包:覆蓋 LoginController.php 中的注銷方法

 use Illuminate\Support\Facades\Auth;

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

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

如果我們查看 Laravel 在 AuthenticatesUsers trait 上的默認注銷功能代碼(位於 laravel 7 的 vendor/laravel/ui/auth-backend/AuthenticatesUsers 下),我們將看到用於重定向的硬編碼路徑。 這意味着我們需要從源代碼更改 url,但是通過供應商編輯文件是錯誤的方式,但是特征為我們提供了一種更好的方法,我們可以覆蓋代碼 所以只需將所有注銷函數的代碼粘貼到 LoginController 頁面並更改重定向('/')函數的參數到你想要的任何網址。 目前我的代碼看起來就像那些只是將它放在 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');
}

在我的情況下,我希望它在注銷后將用戶重定向到主頁'/home' ,但它一直將他重定向到登錄頁面
原因是默認的HomeController使用了 auth 中間件

我不得不刪除這一行$this->middleware('auth'); __construct方法

我剛剛將一個舊網站更新到 Laravel 5.3。 這包括按照升級指南中的建議從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 月)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM