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

Laravel 5.7中Gate与Policy的调用顺序及权限相关疑问

Laravel 5.7 Gate与Policy执行顺序及权限验证疑问

我正在开发一个Laravel 5.7站点,需要在已有若干自定义Gate和Policy的基础上新增相关实现,目前无法明确调用@can($name, $class)时,Gate与Policy的发现及执行顺序。Laravel 5.7官方授权文档提到:

若策略类中没有与要检查的能力名称匹配的方法,则不会调用该策略类的before方法。
若给定模型已注册策略,can方法会自动调用对应策略并返回布尔结果;若未注册策略,则会尝试调用与给定动作名称匹配的闭包型Gate。

我推测@can($name, $class)的执行流程如下:

  1. 通过策略-模型注册关系及$class的类,查找匹配的策略类
  2. 若未找到,跳转至步骤10
  3. 查找与$name匹配的策略方法
  4. 若未找到,跳转至步骤10
  5. 若存在策略的before()方法,执行该方法
  6. 执行步骤1、3找到的策略方法
    7.(策略类是否有after()方法?)
  7. 若存在Gate::before()方法(即使步骤10未找到匹配),执行该方法
  8. 尝试查找并执行匹配的Gate::define()或Gate::resource()方法
  9. 若存在Gate::after()方法(即使步骤10未找到匹配),执行该方法

疑问列表

  • 上述流程是否正确?是否有遗漏?
  • 其他权限验证方法的执行逻辑是否不同?若不同,具体差异是什么?包括:
    • Gate::allow()
    • Gate::denies()
    • $user->can()
    • middleware('can:...')
    • $this->authorize()
    • $this->authorizeResource()
    • @cannot()
  • 策略类是否支持after()方法?
  • 步骤10中Laravel如何查找匹配的Gate?
  • Laravel能否基于$class的类查找匹配的Gate?
  • Gate是否需要与$name完全匹配?
  • 能否根据$class的类识别‘名词-动词’格式的Gate名称并匹配?

补充说明:虽然文档未明确说明,但推测策略方法可识别传入对象的类,而Gate方法不行,这可能是Gate采用‘动词-名词’格式(如update-post)、策略采用‘动词’格式(如update)的原因。


更新

我发现Gate::before()似乎在任何情况下都会先于策略执行。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:21:06