如何防止用户通过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)优雅处理
适合权限逻辑复杂的场景,步骤如下:- 生成用户策略:
php artisan make:policy UserPolicy --model=User - 在
UserPolicy类中添加update权限判断:public function update(User $currentUser, User $user) { return $currentUser->id === $user->id; } - 在
AuthServiceProvider里注册策略:protected $policies = [ User::class => UserPolicy::class, ]; - 控制器方法中调用校验:
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
相关产品推荐
相关产品推荐

