5

场景:

在我的项目中使用 Yii-rights + Yii-user 模块。在权利中,我根据我的控制器操作生成操作,在更新下我添加了一个子 UpdateOwn。

对于 UpdateOwn,bizrule 假设是一个简单的比较,即登录用户的 ID 等于 $model->user_id 字段。

问题:

我了解 yii checkaccess 允许您将变量作为参数传递并与您定义的 bizrule 进行比较。但是 Yii-rights 模块是如何工作的呢?在 bizrule 中使用的数据/参数如何或是什么?如何定义或传递我自己的数据/参数?

4

2 回答 2

5

Yii-rights 是标准 yii-rbac 的包装器。在权限模块中,您有 RBAC 的 Web 界面。当您创建 AuthItem(权限 Web 界面中的操作)时,您可以定义自己的 bizrule。

以下是创建 AuthItem 的代码:

$item = $this->_authorizer->createAuthItem($formModel->name, $type, $formModel->description, $formModel->bizRule, $formModel->data);
$item = $this->_authorizer->attachAuthItemBehavior($item);

_authorizer这是 RAuthorizer 类的示例。然后我们转到 RDbAuthManager,它扩展了 CDbAuthManager,在这里我们创建了AuthItem 函数:

public function createAuthItem($name,$type,$description='',$bizRule=null,$data=null)
    {
        $this->db->createCommand()
            ->insert($this->itemTable, array(
                'name'=>$name,
                'type'=>$type,
                'description'=>$description,
                'bizrule'=>$bizRule,
                'data'=>serialize($data)
            ));
        return new CAuthItem($this,$name,$type,$description,$bizRule,$data);
    } 

这就是在权限中创建 AuthItem 的方式。我个人更喜欢使用网络界面。它有很多很棒的功能并且更容易处理然后每次都去编码。

然后当我们checkAccess()在 AuthItem 上执行时,我们调用执行 bizRule:

public function executeBizRule($bizRule,$params,$data)
    {
        return $bizRule==='' || $bizRule===null || ($this->showErrors ? eval($bizRule)!=0 : @eval($bizRule)!=0);
    }

这就是 yii 中 RBAC 的工作方式,而权限只是它的一个很酷的包装器。权利不会改变必须如何做事的逻辑。

所以在基本的 yii-rbac 中,如果你想只允许更新自己的记录,你可以这样做:

$bizRule='return Yii::app()->user->id==$params["user"]->username;';

$task=$auth->createTask('updateOwnUser','update a your own account',$bizRule);

$task->addChild('updateUser');

然后你这样称呼它:

$user=$this->loadUser();
$params = array('user' => $user);
if(Yii::app()->user->checkAccess('updateOwnUser', $params){
..................
}

在权利上,它已经用过滤器实现了。您唯一需要做的就是添加到您的控制器:

class MyController extends RController{
.............
 public function filters()
    {
        return array(
            'rights', 
            ............
         );
    }
.............
}

因此,在 Web 界面中为项目定义您的 bizrule,更改您的控制器代码,实际上就是这样。要了解在 bizrule 中使用哪些变量,您可以查看 RightsFilter.php 代码,其中执行 checkAccess()。

最重要的是,我将谈谈 checkAccess() 的作用:

  1. 对于用户的每个分配的 auth 项,它首先检查分配的 bizRule 是否返回 true。

  2. 如果为真,它会调用项目的 checkAccess 方法。如果项目的 bizRule 返回 true,

2.1。如果项目名称与原始 checkAccess() 方法中传递的名称相同,则返回 true;

2.2. 否则,对于每个子项,它都会调用其 checkAccess。

希望这将阐明 RBAC 的某些方面并帮助您完成任务。

于 2013-08-22T14:06:51.550 回答
3

yii-rights模块具有以下属性:

/**
* @property boolean whether to enable business rules.
*/
public $enableBizRule = true;

/**
* @property boolean whether to enable data for business rules.
*/
public $enableBizRuleData = false;

要通过 Web 界面设置 bizrule 数据,您必须$enableBizRuleData = true在应用程序配置中进行设置。

请注意,UI 是有限的,您只能为 Auth-Items 设置数据,而不能为 Auth-Assignments 设置数据数据的值也必须是一个序列化的 PHP 变量

正如@ineersa 所述,您可以$data在 bizRule 中以非序列化形式访问。

同样值得注意的是,Yii 首先检查 bizRule 中的 Auth-Item,然后再检查 Auth-Assignment。

[编辑] 添加示例

授权项目

商业规则

检查分配是否具有项目数据中指定的所有键

return BizRule::compareKeys($params, $data, 'Editor');

数据

a:1:{s:8:"language";b:1;}

授权分配

检查应用语言是否与作业数据匹配

商业规则

return BizRule::compareApplicationLanguage($params, $data);

数据

a:1:{s:8:"language";s:5:"de_de";}

[编辑] 添加代码链接

这是完整的助手代码

于 2013-08-28T14:10:50.473 回答