Laravel Sanctum网页登录跳转后出现404 Not Found问题求助
问题分析与解决方案
问题根源
你在网页登录流程中生成了Sanctum Token,但未将Token传递给后续的web请求,导致auth:sanctum中间件无法识别已登录用户,最终触发认证失败(表现为404,大概率是认证失败后的重定向路径不存在)。同时personal_access_token表的last_used_at为空,也验证了生成的Token从未被实际使用。
另外,你混淆了Sanctum的两种使用场景:Sanctum主要用于API无状态认证,而传统网页应用更适合用Laravel原生的Session认证。
解决方案
方案一:改用Session认证(推荐纯web场景)
如果你的应用是传统网页应用,无需使用Sanctum Token做web登录,直接用Session认证即可:
- 修改路由中间件
将auth:sanctum替换为你的自定义guardauth:admins:
Route::middleware(['auth:admins'])->group(function () { Route::get('admindashboard', [AuthController::class, 'adminView'])->name('adminhome'); Route::post('/logout', [AuthController::class, 'logout']); });
- 简化网页登录方法
不需要生成Sanctum Token,Session会自动维护登录状态:
public function login(LoginAdminRequest $request) { $credentials = $request->validate([ 'AdminUsername' => 'required', 'password' => 'required', ]); if (Auth::guard('admins')->attempt($credentials)) { $request->session()->regenerate(); // 防止会话固定攻击 return redirect()->intended('admindashboard'); } return back()->withErrors(['AdminUsername' => 'Invalid credentials']); }
- 验证Guard配置
确保config/auth.php中adminsguard的驱动为session:
'guards' => [ 'admins' => [ 'driver' => 'session', 'provider' => 'admins', ], ], 'providers' => [ 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class, ], ],
方案二:继续使用Sanctum认证(适合API+web混合场景)
如果需要同时支持API和web登录,可将Sanctum Token存入cookie,让后续web请求自动携带:
- 登录时存储Token到Cookie
public function login(LoginAdminRequest $request) { $credentials = $request->validate([ 'AdminUsername' => 'required', 'password' => 'required', ]); if (Auth::guard('admins')->attempt($credentials)) { $admin = Auth::guard('admins')->user(); $token = $admin->createToken('Login Token of ' . $admin->AdminUsername)->plainTextToken; // 将Token存入Cookie,后续请求自动携带 return redirect('admindashboard')->cookie( 'auth_token', $token, 60 * 24 * 7, // 有效期7天 null, null, false, true // HttpOnly,防止XSS攻击 ); } return back()->withErrors(['AdminUsername' => 'Invalid credentials']); }
- 配置Sanctum支持Web请求
确保app/Http/Kernel.php的web中间件组包含Sanctum的状态保持中间件:
protected $middlewareGroups = [ 'web' => [ // ...其他中间件 \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, ], ];
- 添加web域名到Sanctum配置
修改config/sanctum.php,将你的web域名加入stateful数组:
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( '%s%s', 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : '' ))),
关键注意点
auth:sanctum中间件优先识别请求头/Cookie中的Token,而Session认证通过auth:guard_name中间件处理,两者不要混用。- 纯web场景下,Session认证是Laravel的标准实践,比Sanctum Token更简单高效。
- 若仍出现404,需检查
admindashboard路由的定义是否正确,以及认证失败后的重定向逻辑。
内容的提问来源于stack exchange,提问作者I'm_Learning_PHP_Laravel
相关产品推荐
相关产品推荐

