Yii用户->;当auth为父级时,checkAccess为false


Yii user->checkAccess is false when auth is parent

注意:我使用Yii1.1在一个应用程序上,我切换到数据库身份验证管理,以使用更复杂的身份验证系统,但现在我不明白为什么具有父角色的用户无法检查子角色。

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

对于超级管理员用户,此操作失败

我来解释一下:

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

superadmin有2个子项,Normal和Administrator,而Administrator有1个子项,Normal。

显然,每个父母都必须能够做他孩子能做的一切

这是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表内容:itemname userid bizrule数据

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

这意味着用户1同时具有管理员和超级管理员权限。但是checkAccess("管理员")仍然返回FALSE

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

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

adminPermissions、superPermissions和normalPermissions

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

然后将它们添加为角色的子级。(由于该规则为NULL,因此它从不返回TRUE,除非它是某个事物的子级)。

显然,最好创建像updatePost或deleteUser这样的任务和操作,但如果你像我一样从简单的角色开始,并且使用CPhpAuthManager,那么你可以在应用程序已经投入生产时更改为CDbAuthManager,稍后你可以创建任务和操作。

现在在我的应用程序中,我检查adminPermissions或superPermissions,如下所示:

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