Laravel 8 定义Gate做权限校验时出现Attempt to read property "user_id" on int错误
错误原因
- 控制器中
Gate::allows传参规则错误:Laravel Gate 会自动将当前登录用户实例注入到权限校验闭包的第一个参数,不需要手动传入用户ID。你在调用Gate::allows('Utilisateur', Auth::id(), $event)时,把整数类型的用户ID作为第二个参数传入,导致Gate闭包中第二个参数$event实际拿到的是Auth::id()的整数值,调用$event->user_id就会触发 int 类型读取属性的错误。 - Gate定义返回值不规范(非必现问题,但不符合Laravel规范):Gate校验需要返回布尔值,直接返回1/0依赖PHP弱类型转换,存在潜在风险。
修复步骤
- 修正EventsController的edit方法代码
public function edit($id) { if(!Auth::check()) { return redirect('login'); } $event = Events::findOrFail($id); // 仅传入事件模型作为校验参数即可 if(!Gate::allows('Utilisateur', $event)){ abort(403); } // 复用已经查询到的模型实例,避免重复SQL查询 return view('events.edit', ['events' => $event]); }
- 优化AuthServiceProvider中的Gate定义
public function boot() { $this->registerPolicies(); Gate::define('Utilisateur', function ($user, $event) { // 直接返回布尔判断结果,符合Laravel Gate设计规范 return $user->id === $event->user_id; }); }
- 原有Blade代码无需修改,只要Blade模板中传入的
$events是单个Events模型实例即可正常工作,如果是列表页循环渲染,确保循环内传入Gate的是单条模型实例即可。
内容的提问来源于stack exchange,提问作者SouhailMT
相关产品推荐
相关产品推荐

