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)的执行流程如下:
- 通过策略-模型注册关系及
$class的类,查找匹配的策略类 - 若未找到,跳转至步骤10
- 查找与
$name匹配的策略方法 - 若未找到,跳转至步骤10
- 若存在策略的
before()方法,执行该方法 - 执行步骤1、3找到的策略方法
7.(策略类是否有after()方法?) - 若存在
Gate::before()方法(即使步骤10未找到匹配),执行该方法 - 尝试查找并执行匹配的
Gate::define()或Gate::resource()方法 - 若存在
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
相关产品推荐
相关产品推荐

