【问题标题】:Yii: Using an authorization hierarchy correctlyYii:正确使用授权层次结构
【发布时间】:2012-09-20 22:31:22
【问题描述】:

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

我正在尝试按照此处提供的示例进行操作: 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 使其工作?

【问题讨论】:

    标签: yii


    【解决方案1】:

    最好的猜测是 items 数组中的项目无法正常工作。您是否为您的身份验证管理器打开了调试?忘记了属性,但是有一个可以打开以防 bizRule 错误。

    除此之外,它看起来还不错。另外,仅供参考,在 Yii 1.1.11 之后,有一个 $param['userId'] 选项,因此您无需查找当前用户的 ID。

    【讨论】:

    • 这让我更近了一步,我在 bizrule 的末尾少了一个分号。 $bizRule = 'return User::model()->findByPk(Yii::app()->user->getId())->company->id==$params["item"]->company->id;'; 但它仍然没有验证。会不会是我的角色定义不正确?
    • 它在 eval() 中运行结果,因此可能值得设置所有内容并以这种方式检查。或者,如果您有 Xdebug 和 PHP 调试器,那么如果您只是单步调试,那么了解事物是如何设置/如何工作的会非常有帮助。我正在使用 PhpStorm,效果很好。
    • 您在我的 authManager 配置中添加 showErrors=>true 的建议帮助我测试了是否正在应用 bizRule,但我发布了一个可行的解决方案。感谢您的建议。
    【解决方案2】:

    我最终使用了以下方法并且它有效:

    在我的配置中:

    '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';}
    

    现在可以使用了!

    【讨论】:

      猜你喜欢
      • 2015-05-14
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-13
      • 1970-01-01
      • 2011-11-21
      相关资源
      最近更新 更多