在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])
);
答案 0 :(得分:1)
yiis RBAC-cconcept的基本部分保持完全相同。在Yii1和Yii2中,您有以下表格:
auth_item
:拥有实际权利,群组,角色等。auth_item_child
:定义项目的图表/层次结构auth_assignement
:为用户分配项目在Yii2中,你现在有了第四张表:
auth_rule
:持有可重复使用的规则以检查是否实际授予了权利为什么会这样?
规则背后的概念已经存在于Yii1 ......至少是这样的。在Yii1中,您可以在auth_item
和auth_assignement
中定义“bizrule”。 “bizrule”和“data”是这两个表中的列。
列的内容如下:
bizrule
:持有php-code,必须返回一个布尔值。此代码在使用eval()
进行权限检查期间执行。这样,即使用户已分配项目,您也可以控制权利是否被授予。示例:它没有任何意义,但是您可以通过这个bizrule只在偶数小时内为用户提供权利:return date('h') % 2 == 0
。data
:持有参数,可以在执行时传递给bizrule。然后,这些数据可以在bizrule的范围内获得。上述解决方案完美无缺,但bizrule的代码不可重复使用。因此,此功能已提取到自己的表中。
如果查看创建基本rbac-tables(yii\rbac\migrations\m140506_102106_rbac_init.php
)的migration-file,您可以看到项表现在与规则表有关系,而不是在自己的一个中托管代码列。
auth_assignement
和auth_rule
之间没有任何关系。在Yii1中,这允许您一次禁用权限组。由于您可以重复使用规则并将其附加到所有相关项目,因此不再需要这样做,因此将其删除。
如果您查看yii\rbac\DbManager
和yii\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'],
],