我们如何在 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_item
和 auth_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_assignement
和 auth_rule
之间没有任何关系。在 Yii1 中,这允许您一次禁用一组权限。由于您可以重复使用规则并将其附加到所有相关项目,因此不再需要该规则,因此已将其删除。
例子
如果您查看 yii\rbac\DbManager
和 yii\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'],
],
在 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_item
和 auth_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_assignement
和 auth_rule
之间没有任何关系。在 Yii1 中,这允许您一次禁用一组权限。由于您可以重复使用规则并将其附加到所有相关项目,因此不再需要该规则,因此已将其删除。
例子
如果您查看 yii\rbac\DbManager
和 yii\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'],
],