无认证中间件的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模型引入了HasApiTokenstrait: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
相关产品推荐
相关产品推荐

