使用yii\rbac\DbManager配置authManager必须生成四张表,其中的auth_rule表就是存放的规则信息. 规则给角色和权限增加额外的约束条件, 要使用规则, 我们首先必须创建规则类, 该类必须继承yii\rbac\Rule, 并且要实现excute()方法.
使用规则大体流程:
- 根据业务逻辑创建一个规则类;
- 将规则添加至auth_rule表中, 实例化该规则类, 使用authManager的add()方法,传入实例化的对象,即可将规则类添加至auth_rule表中;
- 创建权限或者角色,指定权限或者的authName属性为规则类中定义的$name属性的值, 即可将权限或角色与规则关联起来;
- 为角色分配权限, 为用户分配角色
使用场景举例: 商城后台分类管理中,管理员A创建的分类只允许管理员A来删除.
1. 我们可以创建这样一条规则.
<?php
namespace app\models;
use Yii;
use yii\rbac\Rule;
use app\models\Category;
class AuthorRule extends Rule{
public $name = 'isAuthor'; //规则的名称
/**
* @param string|integer $user 用户 ID.
* @param Item $item 该规则相关的角色或者权限
* @param array $params 传给 ManagerInterface::checkAccess() 的参数
* @return boolean 代表该规则相关的角色或者权限是否被允许
*/
public function execute($user, $item, $params){
$action = Yii::$app->controller->action->id; //获取当前控制器的方法,只对del方法进行判断
if($action == 'del'){
$cateId = Yii::$app->request->get('cateid'); //获取当前删除的分类id
$cateInfo = Category::findOne($cateId);
return $cateInfo->adminid==$user;
}
return true;
}
}
由于本规则只对分类的删除动作来进行权限控制,因此这里先获取当前操作的方法名进行判断, 在点击删除按钮的时候会携带cateid, 所以这里和Yii2官方文档的例子不同的是没有在$params中进行传递参数.
规则类定义好之后, 我们要将它添加到auth_rule表中. 上面提到, 要将一个规则类添加到规则表中, 只需要实例化该类, 并将实例化的对象作为参数传入authManager的add()方法中即可. 首先,创建一个简单的页面提交规则类的名称
在控制器中接收提交的数据,并将规则类添加到auth_rule表中.
/**
* 添加规则
*/
public function actionCreaterule(){
if(Yii::$app->request->isPost){
$post = Yii::$app->request->post();
if(empty($post['class_name'])){
throw new yii\db\Exception('参数错误');
}
$className = "app\\models\\".$post['class_name'];
if(!class_exists($className)){
throw new \Exception('规则类不存在!');
}
$rule = new $className;
if(Yii::$app->authManager->add($rule)){
Yii::$app->session->setFlash('info','添加规则成功!');
}
}
return $this->render("_createrule");
}
2. 创建角色, 并将角色和规则关联起来.
这里的名称是角色名称(用中文), 标识对应的是角色描述(用英文), 例如创建管理员admin, 名称: 管理员, 标识: admin. 注意这里的规则名称要填上面创建的规则类中定义的公共属性$anme的值,如: isAuthor.
后台接收表单提交数据:
/**
* 创建角色
* @return string
*/
public function actionCreaterole(){
if(Yii::$app->request->isPost){
$auth = Yii::$app->authManager;
$role = $auth->createRole(null);
$post = Yii::$app->request->post();
if(empty($post['name'] || $post['description'])){
Yii::$app->session->setFlash('info','名称或标识不能为空!');
return $this->render('_createitem');
}
$role->name = $post['name'];
$role->description = $post['description'];
$role->ruleName = empty($post['rule_name']) ? null : $post['rule_name'];
$role->data = empty($post['data']) ? null : $post['data'];
if($auth->add($role)){
Yii::$app->session->setFlash('info','添加角色成功!');
}
}
return $this->render('_createitem');
}
3. 为角色分配权限(在之前的博客中已经记录).
4. 为用户分配角色(之前博客中已记录)
5. 测试. 创建一个新用户, 为新用户分配上面创建的角色, 使用新用户登录尝试删除其他分类,