可以发现在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('无权查看');//如果没有该权限,抛出一个异常 }
以上我多了个文章参数,传什么由你自己定,我发现一个路由权限只能自定义一个规则,如果能有多个规则那就更灵活了,如何多个规则有人告诉我吗?