我有一个用例,我需要为用户分配编辑高度动态项目的权限,该项目可能有成百上千个。每个用户( 属于相同类型或组 )必须分配给其中一些项目(并且不同的用户可以访问相同的 Company Items )。此外,这些物品的数量会迅速增加或消失。这些项目与用户没有内在联系,但必须任意分配给他们。
让我们称这些项目为 公司项目 。
因此,我希望能够将 公司项目 分配给用户,并动态撤消该访问权限。然后,在控制器内部使用这些分配来检查是否可以执行某些操作…从概念上讲,问题始终相同:测试用户是否有权访问表( 公司项目 表)中的特定项目/行。
我的想法是使用yii RBAC系统,同时尝试 使授权树保持静态 ,从而避免每次创建或删除 公司项目 时创建/删除角色或任务。相反,我想知道是否可以使用中的$data参数assign($itemName, $userId, $bizRule, $data)和类似于以下内容的树来执行此操作:
$data
assign($itemName, $userId, $bizRule, $data)
$params['companyItemId']``$data['companyItemsAllowed']``$data
Yii::app()->user->checkAccess('editItem', array('companyItemId' => 666));
这样,每当我们需要将用户分配更改为 Company Items时 ,我们唯一需要做的就是更改$data['companyItemsAllowed']原始分配内的数组。 角色总是一样的!
$data['companyItemsAllowed']
我决定采取以下方法,决定简单地维持后 公司项目的数组 里面$data['companyItemsAllowed']是 不是 最好的以下要求:
Users
CompanyItems
association_table
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;
这使我可以 维护访问控制界面 ,如下所示:
(回想一下, 我们不需要userId在$params数组上继续传递!。)
userId
$params
当然 ,这将实际分配 公司项目 的权限与 RBAC 系统分开了:我editCompanyItemRole使用Yii提供的RBAC机制分配了一些用户,但是每个实际项目必须通过在association_table…上插入一行来单独分配。
editCompanyItemRole
因此,尽管首先想到的是在内部维护一系列 公司项目$data可能会起作用,但我认为这是最好且更灵活的方法。而且,关于的一般想法bizRule似乎可行。