戏里戏外

Laravel 11 自定义认证中间件

2024-11-05#Laravel

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

最佳实践

  1. 集中管理

    • 所有重定向逻辑都在 bootstrap/app.php 中配置
    • 便于维护和修改
  2. 灵活性

    • 可以使用简单的字符串路径
    • 可以使用闭包实现复杂逻辑
  3. 代码组织

    • 重定向逻辑更清晰
    • 减少了代码重复

注意事项

  • 中间件类现在位于 Illuminate\Auth\Middleware\ 命名空间下
  • 不能直接修改中间件类
  • 所有配置都应该在 bootstrap/app.php 中完成

通过这种新的方式,Laravel 11 让认证重定向的配置变得更加简单和直观。