Laravel中如何根据用户认证状态有条件应用路由中间件?
解决方案:动态根据登录状态应用中间件
你之前的写法失效的核心原因是:路由定义在应用启动阶段执行,此时还没有处理具体请求,auth()->check()判断的是启动时的全局状态(必然未登录),所以不管用户实际是否登录,都会走空中间件分支。
要实现需求,必须在请求处理流程中判断用户状态并动态应用中间件,推荐以下两种可行方案:
方案一:自定义全局中间件(推荐,复用性高)
1. 创建自定义中间件
执行Artisan命令生成中间件文件:
php artisan make:middleware ConditionalAuthMiddleware
2. 编写中间件逻辑
打开app/Http/Middleware/ConditionalAuthMiddleware.php,替换为以下代码:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Contracts\Pipeline\Pipeline; class ConditionalAuthMiddleware { public function handle(Request $request, Closure $next) { // 检查当前请求的用户是否已登录 if ($request->user()) { // 已登录时需要应用的中间件组 $authMiddleware = [ 'auth:sanctum', config('jetstream.auth_session'), 'verified', 'shared.ui' ]; // 通过Pipeline执行指定中间件后,再继续处理请求 return app(Pipeline::class) ->send($request) ->through($authMiddleware) ->then($next); } // 未登录时直接放行请求 return $next($request); } }
3. 注册中间件
打开app/Http/Kernel.php,在$routeMiddleware数组中添加中间件别名:
protected $routeMiddleware = [ // ...其他中间件 'conditional.auth' => \App\Http\Middleware\ConditionalAuthMiddleware::class, ];
4. 配置路由
在路由文件中使用这个自定义中间件:
Route::get('/route', [YourController::class, 'index']) ->middleware('conditional.auth') ->name('route');
方案二:路由闭包中间件(快速实现,无需额外文件)
如果不需要复用逻辑,可以直接在路由中写闭包中间件,省去注册步骤:
use Illuminate\Http\Request; use Illuminate\Contracts\Pipeline\Pipeline; Route::get('/route', [YourController::class, 'index']) ->middleware(function (Request $request, Closure $next) { if ($request->user()) { $authMiddleware = [ 'auth:sanctum', config('jetstream.auth_session'), 'verified', 'shared.ui' ]; return app(Pipeline::class) ->send($request) ->through($authMiddleware) ->then($next); } return $next($request); }) ->name('route');
内容的提问来源于stack exchange,提问作者Adsy2010
相关产品推荐
相关产品推荐

