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

Laravel Sanctum API如何识别发布笔记的用户 关联登录用户新增专属笔记

Laravel SPA场景存储当前用户专属数据实现方案

核心逻辑

Laravel识别当前请求的登录用户,完全依赖你登录阶段下发的身份凭证,不需要前端传递用户ID参数,避免身份伪造。主流实现方案有两种,对应你之前对接登录时用的认证方案即可。

方案1:使用Laravel Sanctum(官方推荐SPA场景)

如果你之前登录用的是Sanctum会话认证,按以下步骤操作:

  • 前端请求配置:全局开启请求凭证携带,以axios为例:
    axios.defaults.withCredentials = true;
    
  • 数据库与模型配置:
    1. 给notes表新增user_id字段,关联users表的id字段做外键约束
    2. User模型新增关联方法:
    public function notes()
    {
        return $this->hasMany(Note::class);
    }
    
    1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:48:03