Laravel 11 引入了一种新的、更简洁的方式来处理认证重定向,本文将详细介绍如何使用这些新特性来自定义认证中间件。
旧版本实现
在之前的 Laravel 版本中,需要修改两个不同的中间件类来自定义用户和访客的重定向。
// App/Http/Middleware/RedirectIfAuthenticated.php
public function handle(Request $request, Closure $next, string ...$guards): Response
{
$guards = empty($guards) ? [null] : $guards;
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
return $request->user()->isAdmin()
? redirect(RouteServiceProvider::ADMIN_HOME)
: redirect(RouteServiceProvider::HOME);
}
}
return $next($request);
}
// App/Http/Middleware/Authenticate.php
protected function redirectTo(Request $request): ?string
{
return $request->expectsJson() ? null : route('account.login');
}
Laravel 11 新方式
在 Laravel 11 中,所有配置都集中在 bootstrap/app.php
文件中处理。
->withMiddleware(function (Middleware $middleware) {
// 简单重定向
$middleware->redirectGuestsTo('/account/login');
// 或使用闭包实现更复杂的逻辑
$middleware->redirectGuestsTo(fn (Request $request) =>
route('account.login')
);
})
->withMiddleware(function (Middleware $middleware) {
// 简单重定向
$middleware->redirectUsersTo('/account/dashboard');
// 根据用户类型重定向到不同仪表板
$middleware->redirectUsersTo(fn (Request $request) =>
$request->user()->isAdmin()
? route('admin.dashboard')
: route('account.dashboard')
);
})
最佳实践
-
集中管理
- 所有重定向逻辑都在
bootstrap/app.php
中配置 - 便于维护和修改
- 所有重定向逻辑都在
-
灵活性
- 可以使用简单的字符串路径
- 可以使用闭包实现复杂逻辑
-
代码组织
- 重定向逻辑更清晰
- 减少了代码重复
注意事项
- 中间件类现在位于
Illuminate\Auth\Middleware\
命名空间下 - 不能直接修改中间件类
- 所有配置都应该在
bootstrap/app.php
中完成
通过这种新的方式,Laravel 11 让认证重定向的配置变得更加简单和直观。