You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:25:47