之情况:
在我的项目中使用Yii-rights + Yii-user模块。在Rights中,我根据我的控制器动作生成了操作,在更新时我添加了一个子UpdateOwn。
对于UpdateOwn,bizrule假设是一个简单的比较,登录用户的ID等于$ model-> user_id字段。
问题:
我理解yii checkaccess允许您将变量作为参数传递并与您定义的bizrule进行比较。但它如何为Yii-rights模块工作?如何或者什么是传入的数据/参数用于bizrule?如何定义或传递我自己的数据/参数?
答案 0 :(得分: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,我们在其中创建了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);
}
这就是权利中创建的AuthItem的方式。我个人更喜欢使用网络界面。它有很多很好的处理,更容易处理,然后每次都去编码。
然后当我们在AuthItem上执行checkAccess()
时,我们调用execute 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()如何做:
对于用户的每个分配的auth项,它首先检查赋值的bizRule是否返回true。
如果为true,则调用item的checkAccess方法。如果项目的bizRule返回true,
2.1。如果项目名称与原始checkAccess()方法中传递的名称相同,则返回true;
2.2。否则,对于每个子项,它都会调用checkAccess。
希望这将澄清RBAC的某些方面并帮助您完成任务。
答案 1 :(得分: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
。
请注意,用户界面有限,您可以仅为Auth-Items设置数据而非Auth-Assignments 。此外,数据的值必须是序列化的PHP变量。
如@ineersa所述,您可以在bizRule中以非序列化形式访问$data
。
值得注意的是,Yii首先检查bizRule的Auth-Item,然后另外检查Auth-Assignment。
[edit]添加了示例
检查作业是否具有项目数据
中指定的所有键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";}
[edit]添加了代码链接