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

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弱类型转换,存在潜在风险。
修复步骤
  1. 修正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]);
}
  1. 优化AuthServiceProvider中的Gate定义
public function boot()
{
    $this->registerPolicies();
    
    Gate::define('Utilisateur', function ($user, $event) {
        // 直接返回布尔判断结果,符合Laravel Gate设计规范
        return $user->id === $event->user_id;
    });
}
  1. 原有Blade代码无需修改,只要Blade模板中传入的$events是单个Events模型实例即可正常工作,如果是列表页循环渲染,确保循环内传入Gate的是单条模型实例即可。

内容的提问来源于stack exchange,提问作者SouhailMT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:24:07