在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/
答案 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)
可接受的答案很好,但是您可以通过简单地覆盖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中定义的目录
引自: -
答案 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)
最简单的方法是覆盖LoginController
中App\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::logout()
并返回重定向到您的路径,或答案 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('/');
更改为您的路线地址。