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

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认证即可:

  1. 修改路由中间件
    将auth:sanctum替换为你的自定义guard auth:admins:
Route::middleware(['auth:admins'])->group(function () {
    Route::get('admindashboard', [AuthController::class, 'adminView'])->name('adminhome');
    Route::post('/logout', [AuthController::class, 'logout']);
});
  1. 简化网页登录方法
    不需要生成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']);
}
  1. 验证Guard配置
    确保config/auth.php中admins guard的驱动为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请求自动携带:

  1. 登录时存储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']);
}
  1. 配置Sanctum支持Web请求
    确保app/Http/Kernel.php的web中间件组包含Sanctum的状态保持中间件:
protected $middlewareGroups = [
    'web' => [
        // ...其他中间件
        \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
    ],
];
  1. 添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:57:23