我们如何在Yii2 RBAC中使用auth_rule表?

时间:2015-05-18 09:13:41

标签: yii2 rbac

在Yii 2 RBAC中,有一个名为 auth_rule 的新表。任何人都可以用一个小例子解释它的用法

create table [auth_rule]
(
[name]  varchar(64) not null,
[data]  text,
[created_at]           integer,
[updated_at]           integer,
primary key ([name])
);

2 个答案:

答案 0 :(得分:1)

yiis RBAC-cconcept的基本部分保持完全相同。在Yii1和Yii2中,您有以下表格:

  • auth_item:拥有实际权利,群组,角色等。
  • auth_item_child:定义项目的图表/层次结构
  • auth_assignement:为用户分配项目

在Yii2中,你现在有了第四张表:

  • auth_rule:持有可重复使用的规则以检查是否实际授予了权利

为什么会这样?

Yii1

规则背后的概念已经存在于Yii1 ......至少是这样的。在Yii1中,您可以在auth_itemauth_assignement中定义“bizrule”。 “bizrule”和“data”是这两个表中的列。

列的内容如下:

  • bizrule:持有php-code,必须返回一个布尔值。此代码在使用eval()进行权限检查期间执行。这样,即使用户已分配项目,您也可以控制权利是否被授予。示例:它没有任何意义,但是您可以通过这个bizrule只在偶数小时内为用户提供权利:return date('h') % 2 == 0
  • data:持有参数,可以在执行时传递给bizrule。然后,这些数据可以在bizrule的范围内获得。

Yii2

上述解决方案完美无缺,但bizrule的代码不可重复使用。因此,此功能已提取到自己的表中。

如果查看创建基本rbac-tables(yii\rbac\migrations\m140506_102106_rbac_init.php)的migration-file,您可以看到项表现在与规则表有关系,而不是在自己的一个中托管代码列。

auth_assignementauth_rule之间没有任何关系。在Yii1中,这允许您一次禁用权限组。由于您可以重复使用规则并将其附加到所有相关项目,因此不再需要这样做,因此将其删除。

实施例

如果您查看yii\rbac\DbManageryii\rbac\BaseManager的实际实施,则不一定需要一个示例。有趣的是以下方法:

  • DbManager::addRule():序列化并保留规则实例
  • DbManager::getRule():在这里您可以看到如何检索,反序列化和返回规则。这意味着规则将以序列化格式保存在auth_rule
  • 的数据列中
  • BaseManager::executeRule():上面加载的规则是通过Rule::execute()
  • 执行的

如果您想添加规则,只需创建yii\rbac\Rule的实例,并将DbManager::addRule($rule)作为其参数调用。这将序列化并保存您的规则,使其可以在其他地方重复使用。真棒!

Voilà......现在应该很清楚了。如果您有一些未解决的问题或想了解更多细节,请撰写评论。 干杯,并有一个很好的!

答案 1 :(得分:0)

规则属性数据已序列化。 这些数据是什么样的?它是否像下面的数组一样尚未反序列化?

[
'allow' => true,
'actions' => ['view'],
'roles' => ['viewPost'],
],