很久没玩Laravel,这次将原来的一个内容网站升级到最新版Laravel,发现版本已从laravel7.x到laravel11.x了,网站比较简单大部分更新都很顺利。
但是也
遇到了问题
网站前端和后台分别使用了2套用户登录验证,前端使用了laravel/ui的用户认证,打开需要用户认证的界面时,能正常跳转到登录界面,而后台不能跳转到后台登录界面了,直接跳回到了首页。
奈何?
找找原因
Laravel 7.x前端未认证用户的重定向的设置是在 app/Http/Middleware/Authenticate.php
// app/Http/Middleware/Authenticate.php
class Authenticate extends Middleware
{
/**
* Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
* @return string|null
*/
protected function redirectTo($request)
{
if (! $request->expectsJson()) {
return route('login');
}
}
}
后端未认证用户的重定向设置,我增加了一个中间件 AdminAuthenticate.php
// app/Http/Middleware/AdminAuthenticate.php
class AdminAuthenticate
{
public function handle($request, Closure $next, $guard = 'admin')
{
if (!Auth::guard($guard)->check()) {
return redirect()->route('admin.login');
}
return $next($request);
}
}
对照了下Laravel 7.x 和 Laravel 11.x版本,app/Http/Middleware中间件已移动到框架,以前的设置无效了,需要调整用户重定向设置方法。
继续查找
解决办法
原来,在Laravel11.x中,设置已迁移到了 bootstrap/app.php 的 withMiddleware 方法回调参数方法中,使用回调方法框架侧的中间件参数,调用redirectGuestsTo方法传入自定义跳转路径。
->withMiddleware(function (Middleware $middleware) {
$middleware->redirectGuestsTo('/login');
// 或者使用闭包方法,使用路由参数
// $middleware->redirectGuestsTo(fn (Request $request) => route('login'));
})
但是这样只能统一跳转到前端登录界面,如何为后台设置未认证用户的重定向?
1)登录路由配置如下:
//后台管理
Route::namespace('Admin')->as('admin.')->group(function () {
……
// 登录页面
Route::get('/login', [LoginController::class, 'index'])->name('login');
……
});
2)修改 withMiddleware 方法中的代码
->withMiddleware(function (Middleware $middleware) {
$middleware->redirectGuestsTo(function (Request $request){
if (!$request->expectsJson()) {
if (in_array('auth:admin', $request->route()->middleware())) {
if (!auth('admin')->check()) {
return route('admin.login');
}
}
}
return route('login');
});
})
搞定,一些逻辑判断再根据需要完善。
标签:Laravel,11,自定义,admin,Middleware,request,function,login,route From: https://blog.csdn.net/ovseawind/article/details/143466534