Laravel API登录后URL访问限制问题求助
嘿,Luca,我明白你遇到的头疼问题了——用API登录把token存到Cookie后,访问带auth中间件的/admin路由时,Laravel还是把你踢回登录页,但去掉中间件又谁都能随便进。这核心原因是Laravel默认的auth中间件是针对session认证的,而你用的是API的token认证逻辑,两个体系不兼容,所以中间件压根识别不到你的登录状态。
下面给你两个实用的解决方案,你可以根据自己的项目情况选:
方案一:自定义适配Cookie Token的认证中间件
这个方案最直接,专门写一个中间件来读取Cookie里的token并验证用户:
生成新的中间件
在终端运行这条命令创建中间件:php artisan make:middleware AuthenticateWithApiToken编写中间件逻辑
打开生成的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); }注册中间件
打开app/Http/Kernel.php,在$routeMiddleware数组里添加一行:'auth.api' => \App\Http\Middleware\AuthenticateWithApiToken::class,修改Admin路由
把原来的路由改成用这个自定义中间件:Route::get('/admin', function () { return view('admin'); })->middleware('auth.api');
方案二:修改API Guard支持从Cookie读取Token
如果你想复用Laravel自带的API认证体系,可以修改Guard的逻辑,让它支持从Cookie取token:
自定义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; }); }配置新的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', ], ],修改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.

