Laravel中如何实现待更新教育记录的请求用户归属校验
归属校验的具体实现方案
首先先梳理下现有代码需要先修正的两个核心问题,不修正的话就算加了校验也跑不通:
- 现有路由定义中没有携带
UserEducation对应的路径参数,控制器方法里注入的UserEducation $education没法通过Laravel的隐式模型绑定解析到真实数据库记录,永远是一个未持久化的空模型。需要先把路由路径补充为包含教育记录ID的形式,比如调整为user/{user}/education/{education}/edit-user-education。 - 原有代码里
$education->user_id = $user->id的逻辑存在严重越权风险:如果待更新的教育记录本来属于其他用户,这行代码会直接篡改记录的归属关系,完全绕过权限校验。这行在更新逻辑中是完全多余且危险的,因为教育记录的归属字段本来就应该在创建记录时绑定完成,更新操作根本不需要修改这个字段,这行代码必须删掉。
方案1:用Laravel授权策略(最符合框架设计规范)
这是Laravel推荐的资源权限校验方式,不用手动写判断逻辑,框架自动处理错误响应:
- 生成对应资源的授权策略类,执行命令:
php artisan make:policy UserEducationPolicy --model=UserEducation - 在生成的策略类中编写更新权限的判断逻辑:
public function update(User $user, UserEducation $education) { // 只有教育记录的归属用户才能执行更新操作 return $user->id === $education->user_id; } - 在控制器方法的开头调用授权校验方法,一旦校验不通过,框架会自动抛出403权限错误,中断后续逻辑:
public function editUserEducation(UserEducation $education, User $user, EditUserEducationRequest $request) { // 权限校验 $this->authorize('update', $education); $education->school = $request->school; $education->degree = $request->degree; $education->save(); return response()->json([ 'message' => 'Education Updated' ]); }
方案2:嵌套路由作用域绑定(最少代码量,最简洁)
如果路由本身就是用户和其下属教育记录的嵌套结构,可以直接开启路由的作用域绑定功能,让框架在解析路由参数时自动校验两个模型的关联关系,连控制器的校验代码都不用写:
- 修正路由定义,开启作用域绑定:
Route::put('user/{user}/education/{education}', [UpdateUserEducationController::class, 'editUserEducation']) ->scopeBindings(); - 开启后,框架在解析
{education}参数时,会自动从当前解析到的$user关联的教育记录中查询匹配的ID:如果传入的教育记录不属于当前路由的用户,会直接返回404,根本不会进入控制器逻辑,既完成了校验,也不会泄露其他用户的资源存在性。
方案3:控制器内显式判断(快速实现,适合临时修改)
如果不想引入策略类或者修改路由绑定,直接在控制器逻辑里加判断即可,代码最直观:
public function editUserEducation(UserEducation $education, User $user, EditUserEducationRequest $request) { // 校验归属是否一致 if ($education->user_id !== $user->id) { abort(403, '无权修改非本人的教育信息'); } $education->school = $request->school; $education->degree = $request->degree; $education->save(); return response()->json([ 'message' => 'Education Updated' ]); }
注意:这种方式会明确告诉请求者“这个ID对应的资源存在,但你没有权限”,如果不希望暴露其他用户的资源存在,可以把abort的状态码改成404,和嵌套绑定的效果一致。
内容的提问来源于stack exchange,提问作者Osman Rafi
相关产品推荐
相关产品推荐

