【原创】yii2角色权限rbac中auth_rule规则表功能作用与使用

可以发现在auth_item表中有个字段rule_name关联到auth_rule,那它是用来做什么的呢?

都叫rule了,无非就是规则,在角色和角色权限下的规则。

创建\common\components\AuthorRule.php文件内容如下:

<?php
namespace common\components;

use yii\rbac\Rule;//从系统自带规则继承

/**
 * Checks if authorID matches user passed via params
 * 检查authorID是否与已经通过参数的用户匹配
 */
class AuthorRule extends Rule
{
    public $name = 'isAuthor';

    /**
     * @param string|integer $user the user ID.
     * @param Item $item the role or permission that this rule is associated with
     * @param array $params parameters passed to ManagerInterface::checkAccess().
     * @return boolean a value indicating whether the rule permits the role or permission it is associated with.
     */
    public function execute($user, $item, $params)//实现rule抽象类里的extends方法
    {
        return isset($params['userid']) ? $params['userid'] == $user : false;//把传送进来的用户id,与当前登录的用户id对比。
    }
}

\advanced\vendor\yiisoft\yii2\rbac\DbManager.php这里调用

if (!$this->executeRule($user, $item, $params)) {
    return false;
}

\advanced\vendor\yiisoft\yii2\rbac\BaseManager.php文件内checkAccess调用checkAccessFromCache或checkAccessRecursive,里面又调用executeRule,最后调用了execute,有点绕,自己按路径和顺序看看。

protected function executeRule($user, $item, $params)
{
    if ($item->ruleName === null) {
        return true;
    }
    $rule = $this->getRule($item->ruleName);//读取auth_rule表中对应的规则
    if ($rule instanceof Rule) {
        return $rule->execute($user, $item, $params);//执行对应的规则
    }

    throw new InvalidConfigException("Rule not found: {$item->ruleName}");
}

auth_rule表中的规则需要用add来添加,对应data字段是blob类型,保存的时候是先把对象序列化成字符串。读取资源流后用stream_get_contents转化成字符串再反序列化成对象。
以下为添加规则的代码。

$auth = Yii::$app->authManager;
// 添加规则
$rule = new \common\components\AuthorRule;//使用创建的类文件创建对象
$auth->add($rule);//执行后去看看表是不是多了一条记录

auth_rule表规则添加完了 怎么用呢?在控制器添加如下代码:

public function beforeAction($action)
{
   if (!parent::beforeAction($action)) {
      return false;//如果父类验证失败,则返回失败
   }
   $permission = $action->controller->module->requestedRoute;//访问的规则路由
   //允许的路由和对应规则参数传送进去进行,系统会调用添加的rule规则进行判断返回。
   if (Yii::$app->user->can($permission, ['article_id' => Yii::$app->request->get('id'),'userid'=>Yii::$app->user->getId()])) {
      return true;//如该用户能访问该请求,则进行返回
   }

   throw new \yii\web\UnauthorizedHttpException('无权查看');//如果没有该权限,抛出一个异常
}

以上我多了个文章参数,传什么由你自己定,我发现一个路由权限只能自定义一个规则,如果能有多个规则那就更灵活了,如何多个规则有人告诉我吗?

此条目发表在服务器分类目录,贴了, 标签。将固定链接加入收藏夹。

发表评论