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

Laravel Sanctum:如何在非auth:sanctum中间件路由中判断用户登录状态

解决方案

要实现特定路由同时对登录/未登录用户开放,并根据状态返回不同内容,核心是使用Sanctum的可选验证中间件,具体步骤如下:

1. 配置路由使用可选Sanctum中间件

不要用强制登录的auth:sanctum中间件,而是用auth:sanctum?(末尾加问号),这个中间件会尝试验证请求中的Sanctum Token,但不会拦截未登录用户的请求。

示例路由代码:

// 同时开放给登录/未登录用户的路由
Route::get('welcome', function () {
    // 判断用户是否通过Sanctum登录
    if (auth('sanctum')->check()) {
        $user = auth('sanctum')->user();
        return response()->json([
            'status' => 'authenticated',
            'message' => "欢迎回来,{$user->name}",
            'user_info' => $user->only('id', 'name', 'email')
        ]);
    } else {
        return response()->json([
            'status' => 'guest',
            'message' => '欢迎访问,请登录以获取专属内容'
        ]);
    }
})->middleware('auth:sanctum?');

2. 在控制器中判断登录状态

如果是控制器方法,逻辑和上面一致,直接用auth('sanctum')来判断和获取用户:

示例控制器代码:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class WelcomeController extends Controller
{
    public function index()
    {
        if (Auth::guard('sanctum')->check()) {
            $user = Auth::guard('sanctum')->user();
            return response()->json([
                'status' => 'authenticated',
                'data' => [
                    'message' => "Hello, {$user->name}",
                    'user' => $user
                ]
            ]);
        }

        return response()->json([
            'status' => 'guest',
            'data' => [
                'message' => 'Hello, Guest!'
            ]
        ]);
    }
}

对应的路由配置:

Route::get('welcome', [WelcomeController::class, 'index'])->middleware('auth:sanctum?');

为什么之前的方法无效?

  • 直接去掉auth:sanctum中间件时,Laravel默认不会用Sanctum Guard去验证请求中的Token,所以Auth::user()会使用默认的Web Guard,自然拿不到Sanctum登录的用户。
  • 用强制的auth:sanctum中间件时,未登录用户会被直接拦截返回401,不符合开放访问的需求。

而auth:sanctum?中间件正好解决了这个矛盾:它会触发Sanctum的Token验证逻辑,验证成功就绑定当前用户,失败也不会拒绝请求,让你能在代码里自由判断用户状态。


内容的提问来源于stack exchange,提问作者dfsdfsdvxcv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:33:37