Yii:正确使用授权层次结构

时间:2012-09-20 22:31:22

标签: yii

我正在尝试验证属于公司的用户是否可以查看属于公司的项目...换句话说,如果他们是员工,他们应该能够查看公司的项目。< / p>

我正在尝试按照此处提供的示例: http://www.yiiframework.com/doc/guide/1.1/en/topics.auth

这是我生成的代码(运行一次):

$auth=Yii::app()->authManager;
$auth->createOperation('viewItem','view an item');
$bizRule = 'return User::model()->findByPk(Yii::app()->user->getId())->company->id==$params["item"]->company->id';
$task=$auth->createTask('companyOwnedItem','view a company-owned item',$bizRule);
$task->addChild('viewItem');

这是main.php中的代码:

        'authManager'=>array(
        'class'=>'CDbAuthManager',
        'connectionID'=>'db',

这是我的控制器中使用的授权部分:

if (Yii::app()->user->checkAccess('companyOwnedItem',array('item'=>$item))) {
    echo 'YES';
} else echo 'NO';

我总是在屏幕上显示“不”。

但是,如果我使用此代码:

if (User::model()->findByPk(Yii::app()->user->getId())->company->id==$item->company->id)

然后我在屏幕上显示'是'。我做错了什么,如何使用Yii的内置authManager使其工作?

2 个答案:

答案 0 :(得分:1)

最好的猜测是items数组中的项目无法正常工作。你打开了auth管理器的调试吗?忘了财产,但有一个在bizRule错误的情况下打开。

除此之外,它看起来是正确的。此外,仅在Yii 1.1.11之后,有一个$ param ['userId']选项,因此您无需查找当前用户的ID。

答案 1 :(得分:0)

我最终使用了以下内容并且有效:

在我的配置中:

'authManager'=>array(
   'class'=>'CDbAuthManager',
   'connectionID'=>'db',
   'defaultRoles'=>array('authenticated'),
   'showErrors'=>true,
),

我的authManager代码:

$auth=Yii::app()->authManager;
    $bizRule = 'return User::model()->findByPk(Yii::app()->user->getId())->company->id==$params["item"]->company->id;';
    $auth->createOperation('companyOwnedItem','view a company-owned item',$bizRule);
    $role = $auth->createRole('authenticated');
    $role->addChild('companyOwnedItem');

然后在我的控制器中:

if (Yii::app()->user->checkAccess('companyOwnedItem',array('item'=>$item))) {
  echo 'YES';
} else {echo 'NO';}

它现在有效!