关于rbac权限设计中的针对模块授权的构思问题.

[color="#FF0000"][size="7"]已测试成功,下楼说明情况.[/size][/color]

设定:

一个yii应用程序中,需要有不用的应用,如:交友/论坛/新闻 等应用.

需求:

每个应用中需要有不同的用户组或角色来区分权限.如下:


交友:


     初级用户(可以查看其他会员的页面,但隐藏联系方式)


     VIP会员 (可以通过"查看"按钮来付费或扣除一点点数来查看单独一个会员的联系方式)


     贵宾    (默认即可显示出联系方式)


论坛:


     初来咋到(可以查看)


     新人    (可以回复)


     住户    (可以发主题帖)


     管理员(分组别)


新闻:


     ......

数据表:

表一:模块表(存储要开通的模块,如:论坛,交友,新闻等)


表二:角色与模块关联表(用于给用户授权某个模块时,拉取可授权的角色列表)


表三:授权表(存储授权关系,如:关联至哪个应用,哪个会员,关联哪个角色,其他,角色由表二来过滤)

实现方法:

借助Yii的Rbac中,商务规则来实现,可参考:


     《应用Yii1.1和PHP5进行敏捷Web开发》第八章:迭代5:用户访问控制 yiibook.com/chapter-8/


通过配置app的config,来给用户默认拥有他可能拥有的角色.


角色的商务规则中,存在两个条件:


     条件一: 表二中是否有本模块与本会员的关联记录


     条件二: 表二中针对个人授权的角色,是否与本角色是同一个

即:




‘components‘ => array( 

    //…… 

    ‘authManager‘=>array( 

            ‘class‘=>‘CDbAuthManager‘,//认证类名称 

            [color="#FF0000"]‘defaultRoles‘=>array(‘guest‘,....(更多的角色)....),//默认角色(这个是重点[/color]

            ‘itemTable‘ => ‘pre_auth_item‘,//认证项表名称 

            ‘itemChildTable‘ => ‘pre_auth_item_child‘,//认证项父子关系 

            ‘assignmentTable‘ => ‘pre_auth_assignment‘,//认证项赋权关系 

        ), 

   //…… 



添加角色时,

$bizRule='return 当前应用ID==当前用户授权表中有这个角色  and 当前角色名==当前用户授权表中有的角色名';

验证:

参数=([color="#0000FF"]本角色ID==授权表中的角色集合[/color])及  当(前模块是否有授权)


Yii::app()->user->checkAccess('某操作',参数)

除了 本角色ID==授权表中的角色集合 这个地方有点想不通怎么处理.

除却这个,理论上这个方法好像可靠.请大家来讨论一下.

根据以上情况,测试如下:

  1. 添加角色:test, bizrule为:return 1==$params["user"];

  2. 添加任务:task, bizrule为:return 2==$params["task"];

  3. 分派角色test拥有任务task的权限.

  4. 配置config/main.php中的认证部分,添加:

    ‘authManager’ => array(

    ...

    ‘defaultRoles’=>array(‘test’),

    ...

    )

  5. 测试:

     $params=array('user'=>1,'task'=>1);
    
    
     if (yii::app()->user->checkAccess('task',$params)){
    
    
         echo("测试成功了,测试成功了");
    
    
     }
    

    结果:无此权限

     $params=array('user'=>1,'task'=>2);
    
    
     if (yii::app()->user->checkAccess('task',$params)){
    
    
         echo("测试成功了,测试成功了");
    
    
     }
    

    结果:测试成功

即:角色的bizRule与任务的bizRule是可同时生效的.即,可以默认给用户一些角色,而这些角色里,通过bizRule来检测用户是否真正拥有该角色.同时,任务的bizRule也是可以这样子实现了,这样就对接了外面的授权与Rbac结合起来了(同理,操作也一样可以这样实现权限判定).

:D 顶以下 留个脚印以便 日后回来再研究

留个脚印