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

无认证中间件的API路由中Auth::user()返回null的问题

解决方案

1. 调整路由配置,添加可选的Sanctum认证中间件

路由需要经过Sanctum中间件,但设置为可选认证——允许未登录用户访问,同时识别携带有效Token的登录用户:

Route::get('products/{product}', [ProductController::class, 'show'])->middleware('auth:sanctum,optional');

2. 修改控制器逻辑,根据用户状态返回不同数据

在控制器中判断用户是否存在,动态添加字段:

class ProductController extends Controller
{
    public function show(Product $product) {
        // 获取当前登录用户(未登录则为null)
        $user = auth('sanctum')->user();

        // 基础数据结构
        $responseData = [
            'name' => $product->name,
            'price' => $product->price,
        ];

        // 登录用户添加额外字段
        if ($user) {
            // 这里替换为你实际获取product_me字段的逻辑,比如关联查询或计算值
            $responseData['product_me'] = $product->productMe()->where('user_id', $user->id)->first() ?? [];
        }

        return response()->json($responseData);
    }
}

3. 关键配置检查

确保你的项目满足以下必要条件:

  • User 模型引入了 HasApiTokens trait:
    use Laravel\Sanctum\HasApiTokens;
    
    class User extends Authenticatable
    {
        use HasApiTokens, HasFactory, Notifiable;
        // ...
    }
    
  • config/auth.php 中 Sanctum 守卫配置正确:
    'guards' => [
        // ...
        'sanctum' => [
            'driver' => 'sanctum',
            'provider' => 'users',
        ],
    ],
    
  • 登录用户请求时,需在请求头携带 Authorization: Bearer {token}(Token 由 Sanctum 生成)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:45:16