当 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')){
注意: 我使用 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')){