Laravel Sanctum API如何识别发布笔记的用户 关联登录用户新增专属笔记
Laravel SPA场景存储当前用户专属数据实现方案
核心逻辑
Laravel识别当前请求的登录用户,完全依赖你登录阶段下发的身份凭证,不需要前端传递用户ID参数,避免身份伪造。主流实现方案有两种,对应你之前对接登录时用的认证方案即可。
方案1:使用Laravel Sanctum(官方推荐SPA场景)
如果你之前登录用的是Sanctum会话认证,按以下步骤操作:
- 前端请求配置:全局开启请求凭证携带,以axios为例:
axios.defaults.withCredentials = true; - 数据库与模型配置:
- 给
notes表新增user_id字段,关联users表的id字段做外键约束 - User模型新增关联方法:
public function notes() { return $this->hasMany(Note::class); }- Note模型新增关联方法:
public function user() { return $this->belongsTo(User::class); } - 给
- 路由配置:将笔记操作接口放到
auth:sanctum中间件组内,自动做身份校验:Route::middleware('auth:sanctum')->group(function () { Route::post('/notes', [NoteController::class, 'store']); // 其他需要登录的接口都可以放这里 }); - 控制器存储逻辑:直接通过当前登录用户的关联关系创建笔记,自动填充
user_id字段:public function store(Request $request) { $validated = $request->validate([ 'title' => 'required|string|max:255', 'content' => 'required|string', ]); // 直接通过认证用户创建,不需要手动传user_id $note = $request->user()->notes()->create($validated); return response()->json($note, 201); }
方案2:使用JWT认证
如果你之前登录用的是JWT token认证,按以下步骤操作:
- 前端请求配置:登录拿到的token存在本地,每次请求请求头携带token:
axios.defaults.headers.common['Authorization'] = `Bearer ${localStorage.getItem('token')}`; - 数据库、模型关联配置和方案1完全一致
- 路由配置:将接口放到
auth:api中间件组内:Route::middleware('auth:api')->group(function () { Route::post('/notes', [NoteController::class, 'store']); }); - 控制器存储逻辑和方案1完全一致,依然通过
$request->user()获取当前登录用户即可
注意事项
- 绝对不要在前端请求中传递
user_id参数,所有身份识别逻辑都由后端通过认证凭证完成,避免出现越权操作漏洞 - 笔记的修改、删除、查询接口,都要额外校验当前登录用户是否是笔记的所属用户,示例:
public function update(Request $request, Note $note) { if ($note->user_id !== $request->user()->id) { return response()->json(['message' => '无操作权限'], 403); } // 执行更新逻辑 } - 用Sanctum方案时需要提前在
.env中配置SANCTUM_STATEFUL_DOMAINS为你的React前端访问地址(比如localhost:3000),SESSION_DOMAIN配置为根域名,保证跨域会话识别正常
内容的提问来源于stack exchange,提问作者hakov68075
相关产品推荐
相关产品推荐

