对于bizrule,Yii-rights params/data

God*_*lla 5 rbac yii yii-extensions

之情况:

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

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

问题:

我理解yii checkaccess允许您将变量作为参数传递并与您定义的bizrule进行比较.但它如何为Yii-rights模块工作?如何或者什么是传入的数据/参数用于bizrule?如何定义或传递我自己的数据/参数?

ine*_*rsa 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);
Run Code Online (Sandbox Code Playgroud)

_authorizer这是一个RAuthorizer类的例子.然后我们转到RDbAuthManager,它扩展了CDbAuthManager,我们在其中创建了CreateItem函数:

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);
    } 
Run Code Online (Sandbox Code Playgroud)

这就是权利中创建AuthItem的方式.我个人更喜欢使用网络界面.它有很多很好的处理,更容易处理,然后每次都去编码.

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

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

这就是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');
Run Code Online (Sandbox Code Playgroud)

然后你这样称呼它:

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

在权利方面,它已经通过过滤器实现.您需要做的只是添加到您的控制器:

class MyController extends RController{
.............
 public function filters()
    {
        return array(
            'rights', 
            ............
         );
    }
.............
}
Run Code Online (Sandbox Code Playgroud)

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

最重要的是,我会说checkAccess()如何做:

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

  2. 如果为true,则调用item的checkAccess方法.如果项目的bizRule返回true,

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

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

希望这将澄清RBAC的某些方面并帮助您完成任务.


sch*_*unk 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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

还值得注意的是,Yii 首先检查 Auth-Item 的 bizRule,然后另外检查 Auth-Assignment。

[编辑] 添加示例

认证项目

商业规则

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

return BizRule::compareKeys($params, $data, 'Editor');
Run Code Online (Sandbox Code Playgroud)

数据

a:1:{s:8:"language";b:1;}
Run Code Online (Sandbox Code Playgroud)

授权分配

检查申请语言是否与作业数据匹配

商业规则

return BizRule::compareApplicationLanguage($params, $data);
Run Code Online (Sandbox Code Playgroud)

数据

a:1:{s:8:"language";s:5:"de_de";}
Run Code Online (Sandbox Code Playgroud)

[编辑]添加代码链接

这是完整的帮助代码