当 auth 为 parent 时,Yii user->checkAccess 为 false

Yii user->checkAccess is false when auth is parent

注意: 我使用 Yii 1.1 在一个应用程序上,我切换到 db auth management 以使用更复杂的 auth 系统,但现在我不明白为什么具有 parent 角色的用户无法检查 child 角色。

if(Yii::app()->user->checkAccess('Administrator')){

超级管理员用户

失败

我自己解释一下:

我有 3 个角色:Normal, Administrator, Superadmin

超级管理员有 2 个 child,普通和管理员,而管理员有 1 个,普通。

显然每个 parent 都必须能够做他 child 能做的一切。

这是我分配角色的 Useridentity 中的代码

...
$this->_id=$myUser->userid;
$this->setState('title', $myUser->access_level);
$auth=Yii::app()->authManager;

if(!$auth->isAssigned($myUser->access_level,$this->_id))
{
  if($auth->assign($myUser->access_level,$this->_id))
  {
    Yii::app()->authManager->save();
  }
}

在我的配置中:

'authManager'=>array(
   'class'=>'CDbAuthManager',
   'defaultRoles'=>array('Normal','Administrator','Superadmin'),
 ),

更多信息 authassignment table 内容: itemname userid bizrule 数据

Administrator   1   NULL    N;
Administrator   8   NULL    N;
Normal  2   NULL    N;
Superadmin  1   NULL    N;

也就是说用户1同时拥有Administrator和Superadmin权限。但是 checkAccess('Administrator') 仍然 returns FALSE

好的,我设法使我的代码正常工作。

我添加了 3 个具有 NULL 规则的任务:

adminPermissions, superPermissions, normalPermissions

$task=$auth->createTask('adminPermissions','...description',NULL);
$task=$auth->createTask('superPermissions','...description',NULL);
$task=$auth->createTask('normalPermissions','...description',NULL);

然后将它们添加为 child 角色。 (因为规则是 NULL,它永远不会 returns TRUE 除非是 child 的东西)。

显然,创建任务和操作(例如 updatePost 或 deleteUser)会更好,但是如果您像我一样从简单的角色开始,并且您使用的是 CPhpAuthManager,那么当应用程序已经投入生产时,您将能够更改为 CDbAuthManager稍后您可以创建您的任务和操作。

现在在我的应用程序中,我会像这样检查 adminPermissions 或 superPermissions:

if(Yii::app()->user->checkAccess('adminPermissions')){