请问『注册授权策略』中的『注册』是什么意思?

是指自动加载 UserPolicy 这个类,然后生成一个实例,然后再登记到 UsersController 这个类的某个地方,供 UsersController 其他方法使用这样一个流程,这样理解对吗?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

是只把 UserPolicy策略和 User模型绑定,这样当你在UsersController(或者其他地方)中使用 $this->authorize('update', $user)时,框架就能知道用的是那个策略来判断了。

5年前 评论
cyan (楼主) 5年前
讨论数量: 2

是只把 UserPolicy策略和 User模型绑定,这样当你在UsersController(或者其他地方)中使用 $this->authorize('update', $user)时,框架就能知道用的是那个策略来判断了。

5年前 评论
cyan (楼主) 5年前

注册授权策略的目的如楼上所说的那样,目的就是把授权策略类和模型类进行绑定,这里我们就是把User模型和UserPolicy策略类进行绑定,为什么要进行绑定呢,目的在于让程序自动的去加载对应的策略类,而是人为的去引入。

在UsersController控制器中的update方法使用$this->authorize方法,这里方法来traitIlluminate\Foundation\Auth\Access\AuthorizesRequests,看下这个方法内部都有什么,两行代码,主要是看第二行代码,这行代码主要的作用就是找到策略类,执行策略类中的动作,验证授权是否通过,通过则执行User控制器update方法剩下的代码,不通过则抛出异常

首先app(Gate::class)->authorize($ability, $arguments)会从容器中取到Gate的实例,Gate服务是什么时候加载到容器中的呢, 从代码中可以看到是在Illuminate\\Auth\\AuthServiceProvider服务提供者被注册后,通过(registerAccessGate)方法把Gate服务加载到容器中,这里我们可以看到Gate的具体实现类是Illuminate\Auth\Access\Gate ,所以这里就可以通过app(Gate::class)获取到Gate实例了

之后调用Gate中的authorize方法,这个方法是在Illuminate\Auth\Access\Gate类中实现的,必须要实现Illuminate\Contracts\Auth\Access接口中的方法,不然无法实例化。authorize方法只有一行代码,这行代码是一个链式调用,我们先看第一个方法inspect,这个方法主要的作用就是对这次请求访问是禁止还是允许。

查看inspect方法内部发现,$this->raw($ability, $arguments)返回授权结果,结果来自我们在UserPolicy中定义的update方法的返回值,true表示授权通过,false表示授权被拒。

由于代码分析比较多,我简单说下是怎么找到授权策略类的,通过在控制器中使用$this->authorize方法的第二个参数的类型,我们这里是App\Models\User,然后调用Gate::guessPolicyNamesUsing()设置的回调函数,也就是我们重构的加载授权策略类的逻辑,这个回调函数的参数值就是App\Models\User,然后通过'App\Policies\\' . class_basename($modelClass) . 'Policy'得到对应的授权策略类为App\Policies\UserPolicy,调用类中的update方法

上面是我的个人分析,如果有错,欢迎指正

5年前 评论
xll123 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!