小编典典

Yii RBAC:访问特定项目/行

sql

我有一个用例,我需要为用户分配编辑高度动态项目的权限,该项目可能有成百上千个。每个用户( 属于相同类型或组
)必须分配给其中一些项目(并且不同的用户可以访问相同的 Company Items
)。此外,这些物品的数量会迅速增加或消失。这些项目与用户没有内在联系,但必须任意分配给他们。

让我们称这些项目为 公司项目

因此,我希望能够将 公司项目
分配给用户,并动态撤消该访问权限。然后,在控制器内部使用这些分配来检查是否可以执行某些操作…从概念上讲,问题始终相同:测试用户是否有权访问表(
公司项目 表)中的特定项目/行。

我的想法是使用yii
RBAC系统,同时尝试 使授权树保持静态 ,从而避免每次创建或删除 公司项目
时创建/删除角色或任务。相反,我想知道是否可以使用中的$data参数assign($itemName, $userId, $bizRule, $data)和类似于以下内容的树来执行此操作:

  • adminUser :角色
    • companyAdmin :角色
    • editCompanyItemRole* :与角色 bizrule ; bizrule 通过简单地检查内部是否存在来测试对 公司项目 的访问;在分配时间,应该会收到一个包含 公司项目 ID的数组,应允许用户对其进行编辑! $params['companyItemId']``$data['companyItemsAllowed']``$data *
      • editItem :操作;用于检查控制器中的访问权限,并应提供 公司物品 ID,以希望对照该用户进行检查,例如,Yii::app()->user->checkAccess('editItem', array('companyItemId' => 666));

这样,每当我们需要将用户分配更改为 Company Items时
,我们唯一需要做的就是更改$data['companyItemsAllowed']原始分配内的数组。 角色总是一样的!

问题:

  1. 这个系统可以用 ,我可以这样使用Yii的RBAC系统 吗?
  2. 假设我们有成千上万的 公司物料 ,并且可能为每个用户分配了数十个 公司物料 ,这是否是满足要求的理想方式 为什么 ??

阅读 181

收藏
2021-04-28

共1个答案

小编典典

我决定采取以下方法,决定简单地维持后 公司项目的数组 里面$data['companyItemsAllowed']不是
最好的以下要求:

  • Users和之间创建了一个关联表CompanyItems; 称呼它association_table;
  • 如问题所示创建了RBAC树,但其中的内容bizRule类似于以下内容:
    $ret = Yii::app()->dbConnection->createCommand('SELECT EXISTS(SELECT 1 FROM `association_table` WHERE user_id=:userId AND company_item_id=:companyItemId)')
    

    ->queryScalar(array(‘:userId’ => $params[‘userId’], ‘companyItemId’ => $params[‘companyItemId’]));
    return $ret;

这使我可以 维护访问控制界面 ,如下所示:

    Yii::app()->user->checkAccess('editItem', array('companyItemId' => 666));

(回想一下, 我们不需要userId$params数组上继续传递!。)

当然 ,这将实际分配 公司项目 的权限与 RBAC
系统分开了:我editCompanyItemRole使用Yii提供的RBAC机制分配了一些用户,但是每个实际项目必须通过在association_table…上插入一行来单独分配。

因此,尽管首先想到的是在内部维护一系列
公司项目$data可能会起作用,但我认为这是最好且更灵活的方法。而且,关于的一般想法bizRule似乎可行。

2021-04-28