景物:
在我的项目中使用Yii-权限+Yii-用户模块。在权限中,我根据我的控制器操作生成操作,在update下我添加了一个子UpdateOwn。
对于UpdateOwn,bizrule应该是登录用户ID等于$model->user_id字段的简单比较。
问题:
我理解允许您将变量作为参数传递,并将其与您定义的双规则进行比较。但是它是如何为Yii-版权模块工作的呢?在双规则中如何传递数据/参数?如何定义或传递自己的数据/参数?
发布于 2013-08-28 14:10:50
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接口设置双规则数据,必须在应用程序配置中设置$enableBizRuleData = true。
请注意,用户界面是有限的,您可以设置数据只用于8月-项,而不是八月作业。此外,数据的值必须是序列化的变量。
正如@ineersa所提到的,您可以在您的$data中以非序列化的形式访问bizRule。
同样值得注意的是,Yii首先检查8月项的bizRule,然后再检查8月赋值。
编辑添加的示例
8月份项目
bizRule
检查赋值是否具有项数据中指定的所有键。
return BizRule::compareKeys($params, $data, 'Editor');数据
a:1:{s:8:"language";b:1;}八月分配
检查应用程序语言是否与赋值数据匹配。
bizRule
return BizRule::compareApplicationLanguage($params, $data);数据
a:1:{s:8:"language";s:5:"de_de";}编辑添加的代码链接
这是全“帮助者法典”
发布于 2013-08-22 14:06:51
Yii-rights是standart yii-rbac的包装。在权限模块中,您有用于RBAC的web接口。当您创建AuthItem (权限操作web接口)时,您可以定义您自己的双规则。
下面是创建AuthItem的代码:
$item = $this->_authorizer->createAuthItem($formModel->name, $type, $formModel->description, $formModel->bizRule, $formModel->data);
$item = $this->_authorizer->attachAuthItemBehavior($item);_authorizer这里是RAuthorizer类的一个例子。然后我们转到RDbAuthManager,它扩展了CDbAuthManager,在那里我们使用createAuthItem函数:
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上执行AuthItem时,我们调用execute bizRule:
public function executeBizRule($bizRule,$params,$data)
{
return $bizRule==='' || $bizRule===null || ($this->showErrors ? eval($bizRule)!=0 : @eval($bizRule)!=0);
}这就是RBAC在yii中的工作方式,而权限只是一个很酷的包装。权利不会改变必须如何做事的逻辑。
因此,在基本的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()是如何做到的:
2.1。如果项目名称与在原始checkAccess()方法中传递的名称相同,则返回true;
2.2。否则,对于每个子项,它都会调用它的checkAccess。
希望这将澄清RBAC的一些方面,并对您的任务有所帮助。
https://stackoverflow.com/questions/18300216
复制相似问题