Laravel10 Sanctum鉴权:同一API路由区分访客与登录用户
修复Laravel Sanctum API身份识别问题,区分访客与已登录用户
1. 调整路由配置(关键前提)
当前路由未启用Sanctum的认证中间件,导致auth()->check()无法正确识别请求中的Token。需要将路由组修改为支持可选认证(访客和登录用户都能访问,同时正确识别身份):
Route::group(['middleware' => ['api', 'Cors', 'auth:sanctum?']], function(){ Route::get('/header', [SettingController::class, 'index']); });
注:auth:sanctum?中的?表示该中间件为可选,不会拒绝未携带Token的请求,但会自动验证合法Token并绑定认证用户。
2. 修复Header API逻辑
修改index方法,解决布尔值错误使用Resource集合的问题,并添加身份标识字段:
public function index(Request $request): JsonResponse { // 初始化默认身份为访客,用户数据为空 $this->body['identity'] = 'guest'; $this->body['UserData'] = []; // 判断是否为已登录用户 if (auth()->check()) { $user = auth()->user(); // 获取当前认证用户的模型实例 $this->body['identity'] = 'client'; $this->body['UserData'] = UserResource::make($user); // 单个用户用make()而非collection() } // 获取导航菜单数据 $categories = Menu::query()->where('active', 1)->orderBy('rank', 'ASC')->get(); $this->body['navbarData'] = MenuResource::collection($categories); return response()->json(['data' => $this->body, 'error' => ''], 200); }
修改点说明
- 新增身份标识:添加
identity字段,直接在响应中明确当前访问者类型(guest/client) - 用户数据修正:用
auth()->user()替代auth()->check(),前者返回用户模型实例,后者仅返回布尔值 - Resource使用修正:单个用户数据使用
UserResource::make($user),collection()仅用于处理多用户集合 - 简化逻辑:初始化默认访客状态,仅在登录时覆盖状态和数据,避免冗余判断
修改后的响应示例
// 访客请求(无Token) { "data": { "identity": "guest", "UserData": [], "navbarData": [ {"title": "Home", "path": "/"}, {"title": "AboutUs", "path": "/AboutUs"}, {"title": "ContactUs", "path": "/ContactUs"} ] }, "error": "" } // 已登录用户请求(携带有效Token) { "data": { "identity": "client", "UserData": { "id": 1, "name": "John Doe", "email": "john@example.com" }, "navbarData": [ {"title": "Home", "path": "/"}, {"title": "AboutUs", "path": "/AboutUs"}, {"title": "ContactUs", "path": "/ContactUs"} ] }, "error": "" }
内容的提问来源于stack exchange,提问作者AhmedSamy
相关产品推荐
相关产品推荐

