• [Yii][RBAC]Yii中应用RBAC完全指南


    开端筹办 

    Yii供给了强大的设备机制和很多现成的类库。在Yii中应用RBAC是很简单的,完全不须要再写RBAC代码。所以筹办工作就是,打开编辑器,跟我来。 
    设置参数、建树数据库 

    在设备数组中,增长以下内容: 

    'components' => array(
        //……
        'authManager'=>array(
                'class'=>'CDbAuthManager',//认证类名称
                'defaultRoles'=>array('guest'),//默认角色
                'itemTable' => 'pre_auth_item',//认证项表名称
                'itemChildTable' => 'pre_auth_item_child',//认证项父子关系
                'assignmentTable' => 'pre_auth_assignment',//认证项赋权关系
            ),
       //…… 

    那这三个数据表怎么建树呢?很简单,去看framework/web/auth/schema.sql。重视要和你的自定义的表名称对应起来。比如SQL文件中的AuthItem你要批改为pre_auth_item。然后在数据库中运行这个SQL文件中的语句。 
    懂得概念 

    你可能要问,剩下的代码呢?我告诉你,没有啦。RBAC体系就如许建树起来了。然则为了应用它,你须要懂得它的运行机制。我会尽量讲的烦琐一点……(官方的RBAC文档在这里,然则我曾经看了4-5遍才熟悉打听。) 
    三个概念 

    你须要懂得的是,授权项目可分为operations(步履),tasks(任务)和 roles(角色)。 

    一个用户拥有一个或者多个角色,比如,我们这里有三个角色:银行行长、银行人员、顾客。我们假设: 

        * 张行长 有角色:银行行长、银行人员、顾客(人家本身可以存钱嘛)。 
        * 王人员 有角色:银行人员、顾客。 
        * 小李 有角色:顾客。 

    那么,响应的,只要顾客可以做的工作,小李就可以做,王人员和张行长也可以。银行人员可以做的工作,王人员和张行长都可以做,小李就不成以了。 

    比如,一个“顾客”可以存钱,那么拥有“顾客”角色的张行长、王人员、小李都可以存钱。“银行人员”可以打印顾客的交易记录,那么有“银行人员” 角色的张行长和王人员都可以,而小李不可,必须找一个有“银行人员”角色的人才可以打印具体的交易记录。一个“银行行长”才可以进入银行钱库提钱,那么只 有张行长可以,因为它才有“银行行长”的角色。 

    这就是基于角色的认证体系,简称RBAC。 
    角色的持续 

    角色是可以持续的,比如我们规定如下: 

        * 凡是“银行行长”都是“银行人员”,也就是说,只要银行人员可以做的工作,银行行长都可以做。 
        * 凡是“银行人员”都是顾客,同上,顾客可以做的工作银行人员也可以做。 

    那么角色关系就变成了: 

        * 张行长 有角色:银行行长。 
        * 王人员 有角色:银行人员。 
        * 小李 有角色:顾客。 

    如许更简单了,这就是角色的持续。 
    任务的持续 

    一个任务(task)是可以包含别的一个任务的,我们举个例子,比如“进入银行”。 

    我们设定“顾客”这个角色有“进入银行”的权限。也就是说,“顾客”可以履行“进入银行”的任务。接下来,我们假设“进入柜台”是进入银行的父权 限,也就是说,“进入柜台”包含“进入银行”。只要能“进入柜台”的人都可以“进入银行”。我们把“进入柜台”这个任务权限给“银行人员”。 

    那么从角色上来说,王人员可以进入银行,因为王人员的角色是“银行人员”,而“银行人员”包含了“顾客”的角色。那么“顾客”可以进行的“任务”对于“银行人员”来说也是可以进行的。而“顾客”可以“进入银行”,那么王人员也可以“进入银行”。这是角色的持续带来的。 

    我们再假设有个赵辅导,是上级辅导,可以进入柜台进行观察。那么,我们的任务关系是: 

        * 赵辅导 有任务:进入柜台。 

    那么,赵辅导就可以“进入银行”。因为“进入银行”是被“进入柜台”包含的任务。只要可以履行“进入柜台”的人都可以履行“进入银行”。这就是任务的持续。 
    关于步履 

    步履是不成划分的一级。也就是说。而一个步履是不克不及包含其他步履的。假设我们有个步履叫“从银行仓库中提钱”。我们把这个步履作包含“进入柜台”。那么只要可以履行“从银行仓库中提钱”的角色都可以履行“进入柜台”这个任务。 
    三者关系 

        * 一个角色可以包含别的一个或者几个角色。 
        * 一个角色可以包含别的一个或者几个任务。 
        * 一个角色可以包含别的一个或者几个步履。 
        * 
        * 一个任务可以包含别的一个或者几个任务。 
        * 一个任务可以包含别的一个或者几个步履。 
        * 
        * 一个步履只能被角色或者任务包含,步履是不成以包含其他,也不成再分。 

    如许,就形成了一个权限经管体系。关于“任务”和“步履”,你不必思虑其字面上的意义。这两者就是形成两层权限。 
    进行赋权 

    我们建树了RBAC权限经管,就须要进行对权限的WEB经管。这些就须要你本身写代码了。 

    按照不合种类的项目调用下列办法之必然义授权项目: 

        * CAuthManager::createRole 
        * CAuthManager::createTask 
        * CAuthManager::createOperation 

    一旦我们拥有一套授权项目,我们可以调用以下办法建树授权项目关系: 

        * CAuthManager::addItemChild 
        * CAuthManager::removeItemChild 
        * CAuthItem::addChild 
        * CAuthItem::removeChild 

    最后,我们调用下列办法来分派角色项目给各个用户: 

        * CAuthManager::assign 
        * CAuthManager::revoke 

    下面我们将显现一个例子是关于用所供给的API建树一个授权等级: 

    $auth=Yii::app()->authManager;
    
        $auth->createOperation("createPost","create a post");
        $auth->createOperation("readPost","read a post");
        $auth->createOperation("Post"," a post");
        $auth->createOperation("Post"," a post");
    
        $bizRule="return Yii::app()->user->id==$params["post"]->authID;";
        $task=$auth->createTask("OwnPost"," a post by author himself",$bizRule);
        $task->addChild("Post");
    
        $role=$auth->createRole("reader");
        $role->addChild("readPost");
    
        $role=$auth->createRole("author");
        $role->addChild("reader");
        $role->addChild("createPost");
        $role->addChild("OwnPost");
    
        $role=$auth->createRole("editor");
        $role->addChild("reader");
        $role->addChild("Post");
    
        $role=$auth->createRole("admin");
        $role->addChild("editor");
        $role->addChild("author");
        $role->addChild("Post");
    
        $auth->assign("reader","readerA");
        $auth->assign("author","authorB");
        $auth->assign("editor","editorC");
        $auth->assign("admin","adminD");

    也就是说,你须要本身写一个经管界面,来列出你的角色、任务、步履,然后可以在这个界面长进行经管。比如增长、删除、批改。 

    权限搜检 

    假设你在你的经管界面进行了赋权,那么可以在法度里面进行权限搜检: 

    if(  Yii::app()->user->checkAccess("createPost")  )
    
    {
    
        // 这里可以显示表单等操纵
    
    } else {
    
        // 搜检没有经由过程的可以跳转或者显示警告
    
    } 

    上方的代码就搜检了用户是否可以履行“createPost”,这createPost可能是一个任务,也可所以一个步履。 


    其他的:

    对于很多说Yii权限体系RBAC不好用的人其实都没有看懂文档。综合我的体验,我感触感染Yii框架的RBAC是我用过的框架里面最好用的。并且是须要本身写代码起码的。 

    Yii的RBAC有加倍高等的用法,比如“营业规矩”,“默认角色”。你可以去参考官方文档。 

    我知道,会有项目组人仿照还是不睬解RBAC,或者不会用Yii的RBAC。没有关系,你可以鄙人方的评论框里提问。 


    happy Yii !

    From; http;//my.oschina.net/o0Kira0o/blog/95036

  • 相关阅读:
    php——验证身份证是否合法的函数
    php——离线执行任务
    代码整洁之道
    js自适应屏幕高度
    SSH Junit4测试
    Java Persistence with Hibernate
    SSH搭建
    js整理
    Hibernate 应用
    对学习的一点感想
  • 原文地址:https://www.cnblogs.com/imxiu/p/3415081.html
Copyright © 2020-2023  润新知