这篇文章主要介绍了关于laravel 权限控制 gate policy,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
关于权限
本质 针对一段可执行的逻辑单元描述是否开启生产的判断。
定义 必定有一用户实例或唯一标识参数,以及与之关联的使用资源。通常使用闭包或函数或方法
使用 调用权限逻辑单元句柄,参数 权限操作对象,用户信息。
源起
最基本的权限控制,三元运算符 ?:。很显然条件判断,后面跳到相应的执行逻辑。
laravel的思路是将执行逻辑(生产代码),授权(条件判断逻辑)进行分离。重点关注条件的产生,通俗讲强化授权逻辑(这对复杂的授权十分有用)。公设:所有的代码在服务注册完毕后,启动。所以下面这段代码会被注册。其目的是找到真正授权判断的逻辑体。
gate::define('update articles', 'articlepolicy@update')
其中第一个参数显然只是一个授权标识符(用来调用的句柄参数),第二个参数才为授权的逻辑执行体。
laravel授权定义
在 authserviceprovider 的 boot 方法里定义授权
gate::define('update articles', function ($user, $article) {
return $user->id == $article->user_id;
});
gate::define('update articles', 'articlepolicy@edit');
<?php
namespace app\policies;
use app\user;
use app\models\article;
class articlepolicy
{
public function update(user $user, article $article)
{
return $user->id == $article->author_id;
}
}
laravel授权使用
gate 门面:gate::allows('update articles', $article) 和 gate::denies('update articles', $article)。
controller 引入了
trait authorizesrequests
$this->authorize('update articles', $article)。
blade 模板:@can('update articles', $article) 和 @cannot('update articles', $article) 指令。
user model 实例:$user->can('update articles', $article) 和 $user->cannot('update articles', $article)。
laravel policy
为了方便地定义和使用授权,laravel 在gate的基础上引入了 policy。policy内部的每一个方法,都会被用gate::define方法的描述注册。所以这就是为什么使用了策略类注册之后,即便没有用gate门面定义授权逻辑,在控制器内仍然可以使用gate::allow('策略类方法')的形式来进行授权判断 。
在 authserviceprovider 的 policies 数组属性里先定义授权映射关系
/**
* the policy mappings for the application.
*
* @var array
*/
protected $policies = [
article::class => articlepolicy::class,
];
<?php
namespace app\policies;
use app\user;
use app\models\article;
use illuminate\auth\access\handlesauthorization;
class articlepolicy
{
use handlesauthorization;
public function create(user $user)
{
return true;
}
public function delete(user $user, article $article)
{
return $user->id == $article->author_id;
}
public function before($user, $ability)
{
if($user->issuperadmin()){
return true;
}
}
}
注意:
policy 只是在普通 php 类基础上添加了一个 handlesauthorization trait。
在 policy 中会在所有方法执行前调用,经常用到的地方就是处理管理员授权逻辑。
相关推荐:
laravel利用gulp如何构建前端资源
以上就是laravel 权限控制 gate policy的详细内容。