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

Yii:正确使用授权层次结构,yii,Yii,我试图验证属于公司的用户是否可以查看属于公司的项目…换句话说,如果他们是员工,他们应该能够查看公司的项目 我试图遵循这里提供的示例: 这是我生成的代码(运行一次): 这是main.php中的代码: 'authManager'=>array( 'class'=>'CDbAuthManager', 'connectionID'=>'db', 这是我的控制器中使用的授权件: if (Yii::app()->user->c

我试图验证属于公司的用户是否可以查看属于公司的项目…换句话说,如果他们是员工,他们应该能够查看公司的项目

我试图遵循这里提供的示例:

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

这是main.php中的代码:

        'authManager'=>array(
        'class'=>'CDbAuthManager',
        'connectionID'=>'db',
这是我的控制器中使用的授权件:

if (Yii::app()->user->checkAccess('companyOwnedItem',array('item'=>$item))) {
    echo 'YES';
} else echo 'NO';
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使其工作?

最好的猜测是items数组中的项工作不正常。您是否已打开身份验证管理器的调试?忘记了该属性,但在出现bizRule错误的情况下,可以打开一个属性


除此之外,它看起来是正确的。另外,仅供参考,在Yii 1.1.11之后,有一个$param['userId']选项,这样您就不需要查找当前用户的ID。

我使用了以下选项,它起到了作用:

在我的配置中:

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

现在它可以工作了

这让我更接近了一步,我在我的bizrule末尾缺少了一个分号<代码>$bizRule='return User::model()->findByPk(Yii::app()->User->getId())->company->id=$params[“item”]->company->id;'但仍无法验证。可能是我定义的角色不正确吗?它在eval()中运行结果,因此可能值得设置所有内容并以这种方式进行检查。或者,如果您有Xdebug和PHP调试器,如果您只需一步一步地完成,那么查看事情是如何设置的/它们是如何工作的将非常有帮助。我使用的是PhpStorm,效果很好。您建议在我的authManager配置中添加
showErrors=>true
,这有助于我测试是否应用了bizRule,但我发布了一个有效的解决方案。谢谢你的建议。