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

Laravel API登录后URL访问限制问题求助

解决Laravel API登录后Admin路由Auth中间件不识别的问题

嘿,Luca,我明白你遇到的头疼问题了——用API登录把token存到Cookie后,访问带auth中间件的/admin路由时,Laravel还是把你踢回登录页,但去掉中间件又谁都能随便进。这核心原因是Laravel默认的auth中间件是针对session认证的,而你用的是API的token认证逻辑,两个体系不兼容,所以中间件压根识别不到你的登录状态。

下面给你两个实用的解决方案,你可以根据自己的项目情况选:

方案一:自定义适配Cookie Token的认证中间件

这个方案最直接,专门写一个中间件来读取Cookie里的token并验证用户:

  1. 生成新的中间件
    在终端运行这条命令创建中间件:

    php artisan make:middleware AuthenticateWithApiToken
    
  2. 编写中间件逻辑
    打开生成的app/Http/Middleware/AuthenticateWithApiToken.php,把handle方法改成这样:

    public function handle(Request $request, Closure $next)
    {
        // 从Cookie里取出你登录时存入的token
        $token = $request->cookie('api_token');
        
        // 没有token就跳回登录页
        if (!$token) {
            return redirect()->route('login');
        }
        
        // 根据token查找对应的用户(这里假设你的User模型有api_token字段)
        $user = \App\Models\User::where('api_token', $token)->first();
        
        // 找不到用户也跳回登录
        if (!$user) {
            return redirect()->route('login');
        }
        
        // 手动设置当前登录用户
        auth()->login($user);
        
        return $next($request);
    }
    
  3. 注册中间件
    打开app/Http/Kernel.php,在$routeMiddleware数组里添加一行:

    'auth.api' => \App\Http\Middleware\AuthenticateWithApiToken::class,
    
  4. 修改Admin路由
    把原来的路由改成用这个自定义中间件:

    Route::get('/admin', function () {
        return view('admin');
    })->middleware('auth.api');
    

方案二:修改API Guard支持从Cookie读取Token

如果你想复用Laravel自带的API认证体系,可以修改Guard的逻辑,让它支持从Cookie取token:

  1. 自定义Guard驱动
    打开app/Providers/AuthServiceProvider.php,在boot方法里添加自定义Guard的逻辑:

    use Illuminate\Auth\TokenGuard;
    use Illuminate\Support\Facades\Auth;
    
    public function boot()
    {
        $this->registerPolicies();
    
        // 注册一个支持Cookie读取token的guard驱动
        Auth::extend('api_cookie', function ($app, $name, array $config) {
            $guard = new TokenGuard(
                $app['auth']->createUserProvider($config['provider']),
                $app['request']
            );
    
            // 优先从Cookie取token,没有再从请求头取
            $guard->setTokenResolver(function ($request) {
                return $request->cookie('api_token') ?? $request->header('Authorization');
            });
    
            $app->refresh('request', $guard, 'setRequest');
    
            return $guard;
        });
    }
    
  2. 配置新的Guard
    打开config/auth.php,在guards数组里添加新的guard:

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],
        'api_cookie' => [
            'driver' => 'api_cookie',
            'provider' => 'users',
        ],
    ],
    
  3. 修改Admin路由
    路由里指定用这个新的guard:

    Route::get('/admin', function () {
        return view('admin');
    })->middleware('auth:api_cookie');
    

额外注意:登录存Cookie的细节

登录成功后设置Cookie时,记得配置正确的参数,确保Cookie能被/admin路由读取到,比如:

// 这里假设$token是你生成的API token,有效期设为7天
return redirect()->route('admin')
    ->cookie('api_token', $token, 60*24*7, '/', env('APP_DOMAIN'), false, true);

最后一个true开启httponly,可以防止XSS攻击,建议开启。

内容的提问来源于stack exchange,提问作者Luca D.R.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:28:32