我们如何在Yii2 RBAC中使用auth_规则表?

我们如何在Yii2 RBAC中使用auth_规则表?,yii2,rbac,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]) ); YIS RBAC概念的基本部分保持完全相同。在Yii1和Yii2中,您都有以下表格

在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])
);

YIS RBAC概念的基本部分保持完全相同。在Yii1和Yii2中,您都有以下表格:

  • auth_item
    :保存实际的权限、组、角色等
  • auth\u item\u child
    :定义项目的图形/层次结构
  • auth\u assignment
    :将项目分配给用户
在Yii2中,您现在有了第四个表:

  • auth_rule
    :保存可重用规则以检查是否实际授予了权限
为什么会这样

Yii1 规则背后的概念已经存在于Yii1中……至少有点。在Yii1中,您可以在
auth_项
auth_赋值
中定义“bizrule”。“bizrule”和“data”是这两个表中的列

各栏的内容如下:

  • bizrule
    :包含必须返回布尔值的php代码。此代码是在使用
    eval()
    进行权限检查时执行的。这样,即使用户分配了项目,您也可以控制是否授予了权限。示例:这毫无意义,但您可以使用以下bizrule仅在偶数小时内授予用户权限:
    返回日期('h')%2==0
  • 数据
    :在执行时可以传递给bizrule的保留参数。该数据随后在bizrule的范围内可用
Yii2 除了bizrule的代码不可重用之外,上述解决方案非常有效。因此,该功能被提取到它自己的表中

如果查看创建基本rbac表的迁移文件(
yii\rbac\migrations\m140506\u 102106\u rbac_init.php
),您可以看到项目表现在与规则表有一个关系,而不是将代码托管在其自己的列中

但是,
auth_赋值
auth_规则
之间没有关系。在Yii1中,这允许您立即禁用权限组。由于可以重用规则并将其附加到所有相关项,因此不再需要此规则,因此已将其删除

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

  • DbManager::addRule()
    :序列化并持久化规则实例
  • DbManager::getRule()
    :在这里您可以看到如何检索、取消序列化和返回规则。这意味着规则以序列化格式保存在
    auth\u rule
    的数据列中
  • BaseManager::executeRule()
    :上面加载的规则通过
    rule::execute()执行。
如果要添加规则,只需创建
yii\rbac\rule
的实例,并调用
DbManager::addRule($rule)
,将其作为参数。这将序列化并保存您的规则,使其可在其他地方重用。太棒了

瞧……现在应该很清楚了。如果你有一些悬而未决的问题或者想要更多的细节,就写一条评论。
干杯,祝你过得愉快

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

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