首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Yii-双轨制的权利参数/数据

Yii-双轨制的权利参数/数据
EN

Stack Overflow用户
提问于 2013-08-18 14:39:45
回答 2查看 2.5K关注 0票数 5

景物:

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

对于UpdateOwn,bizrule应该是登录用户ID等于$model->user_id字段的简单比较。

问题:

我理解允许您将变量作为参数传递,并将其与您定义的双规则进行比较。但是它是如何为Yii-版权模块工作的呢?在双规则中如何传递数据/参数?如何定义或传递自己的数据/参数?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-28 14:10:50

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

代码语言:javascript
复制
/**
* @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

检查赋值是否具有项数据中指定的所有键。

代码语言:javascript
复制
return BizRule::compareKeys($params, $data, 'Editor');

数据

代码语言:javascript
复制
a:1:{s:8:"language";b:1;}

八月分配

检查应用程序语言是否与赋值数据匹配。

bizRule

代码语言:javascript
复制
return BizRule::compareApplicationLanguage($params, $data);

数据

代码语言:javascript
复制
a:1:{s:8:"language";s:5:"de_de";}

编辑添加的代码链接

这是全“帮助者法典”

票数 3
EN

Stack Overflow用户

发布于 2013-08-22 14:06:51

Yii-rights是standart yii-rbac的包装。在权限模块中,您有用于RBAC的web接口。当您创建AuthItem (权限操作web接口)时,您可以定义您自己的双规则。

下面是创建AuthItem的代码:

代码语言:javascript
复制
$item = $this->_authorizer->createAuthItem($formModel->name, $type, $formModel->description, $formModel->bizRule, $formModel->data);
$item = $this->_authorizer->attachAuthItemBehavior($item);

_authorizer这里是RAuthorizer类的一个例子。然后我们转到RDbAuthManager,它扩展了CDbAuthManager,在那里我们使用createAuthItem函数:

代码语言:javascript
复制
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:

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

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

因此,在基本的yii-rbac中,如果您想只允许更新自己的记录,那么可以:

代码语言:javascript
复制
$bizRule='return Yii::app()->user->id==$params["user"]->username;';

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

$task->addChild('updateUser');

然后你就这样称呼它:

代码语言:javascript
复制
$user=$this->loadUser();
$params = array('user' => $user);
if(Yii::app()->user->checkAccess('updateOwnUser', $params){
..................
}

在权限方面,它已经用过滤器实现了。您需要做的唯一一件事就是添加到控制器中:

代码语言:javascript
复制
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的一些方面,并对您的任务有所帮助。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18300216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档