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

如何防止用户通过User ID访问其他用户数据?Laravel权限优化

解决Laravel中用户越权编辑其他用户资料的问题

我通过以下代码创建了一个路由:

Route::get('/admin/edit/user/{user_id}', [UserController::class, 'editUser'])->name('edit.user');

用户点击编辑按钮时,访问链接https://0608sns.org/admin/edit/user/1789可编辑自身资料,但如果用户手动修改URL中的ID为1790,就能访问并编辑其他用户的资料,请问该如何阻止这种情况?


几种可行的解决方案:

  • 控制器内直接校验权限
    在editUser方法里先获取当前登录用户,对比URL传入的user_id和当前用户ID,不匹配就直接拒绝访问:

    public function editUser($user_id)
    {
        $currentUser = auth()->user();
        
        if ($currentUser->id != $user_id) {
            abort(403, '你没有权限编辑该用户资料');
        }
        
        $user = User::findOrFail($user_id);
        return view('admin.edit.user', compact('user'));
    }
    
  • 结合路由模型绑定校验
    先把路由改成模型绑定的形式,直接注入User实例,再对比当前用户:
    路由修改:

    Route::get('/admin/edit/user/{user}', [UserController::class, 'editUser'])->name('edit.user');
    

    控制器方法:

    public function editUser(User $user)
    {
        if (auth()->user()->id != $user->id) {
            abort(403);
        }
        
        return view('admin.edit.user', compact('user'));
    }
    
  • 用Laravel策略(Policy)优雅处理
    适合权限逻辑复杂的场景,步骤如下:

    1. 生成用户策略:
      php artisan make:policy UserPolicy --model=User
      
    2. 在UserPolicy类中添加update权限判断:
      public function update(User $currentUser, User $user)
      {
          return $currentUser->id === $user->id;
      }
      
    3. 在AuthServiceProvider里注册策略:
      protected $policies = [
          User::class => UserPolicy::class,
      ];
      
    4. 控制器方法中调用校验:
      public function editUser(User $user)
      {
          $this->authorize('update', $user);
          
          return view('admin.edit.user', compact('user'));
      }
      
  • 辅助手段:隐藏真实ID
    可以不用真实用户ID作为路由参数,改用加密后的ID或者自定义唯一标识(比如基于用户名的slug),增加用户猜测其他用户ID的难度,但这只是辅助,核心还是要做权限校验。


内容的提问来源于stack exchange,提问作者H.M. Mohiuddin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:57:49