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

How can we use the auth_rule table in Yii2 RBAC?

在 Yii 2 RBAC 中,有一个新的 table 叫做 auth_rule。谁能用一个小例子解释一下它的用法

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

yiis RBAC-c 概念的基本部分保持完全相同。在 Yii1 和 Yii2 中你有以下 tables:

  • auth_item:拥有实际的权限、组、角色等
  • auth_item_child:定义项目的图形/层次结构
  • auth_assignement: 将项目分配给用户

在 Yii2 中你现在有第四个 table:

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

这是为什么?

Yii1

规则背后的概念已经存在于 Yii1 中......至少有点。在 Yii1 中,您可以在 auth_itemauth_assignement 中定义 "bizrule"。 "bizrule" 和 "data" 都是 table 中的列。

列的内容如下:

  • bizrule:持有 php-code 必须 return 一个布尔值。此代码是在 eval() 的权限检查期间执行的。这样您就可以控制是否授予权限,即使用户已分配项目也是如此。示例:这没有任何意义,但您可以使用以下 bizrule 仅在偶数小时内授予用户权限:return date('h') % 2 == 0.
  • data:持有的参数可以在执行时传递给bizrule。该数据随后在 bizrule 范围内可用。

Yii2

除了bizrule 的代码不可重用外,上述解决方案非常有效。因此,此功能被提取到它自己的 table.

如果您查看创建基本 rbac-tables (yii\rbac\migrations\m140506_102106_rbac_init.php) 的迁移文件,您可以看到项目 table 现在与规则相关 - table 而不是将代码托管在它自己的列之一中。

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

例子

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

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

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

瞧...现在应该很清楚了。如果您有一些悬而未决的问题或想要更多详细信息,请发表评论。 干杯,祝你好运!

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

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