+ -
当前位置:首页 → 问答吧 → RBAC的授权一定要到操作吗

RBAC的授权一定要到操作吗

时间:2011-12-10

来源:互联网

请问高手们,RBAC的授权一定要到操作吗?有没有授权给模块,全部的操作都继承有权限的做法?

比如:
Node表中有
id     name      title           pid    level     
2     Article     文章管理      1        2
3     Photo      图片管理      1        2
4     Insert      插入           3        3
5     Update    修改            3        3

在授权的时候,access表中
授了Article模块,由于模块在节点中没有下一层操作的节点,就具有了Article的全部操作权限
由于Photo模块有下一层的操作节点,就必须要再单独授操作权限。

作者: jxxysong   发布时间: 2011-12-10



是不是大家也和我一样,后台的模块比较多,有些模块权限又不想继续细化到操作权限上。
我对RBAC进行了一点小的修改,基本实现了目的,看看大家有什么斧正之处不?!
我的想法是:进行节点表的判断,如果模块(level=2)下没有操作(level=3),就只验证到模块段即可。
  1.     //权限认证的过滤器方法
  2.     static public function AccessDecision($appName=APP_NAME)
  3.     {
  4.         //检查是否需要认证
  5.         if(RBAC::checkAccess()) {
  6.             //存在认证识别号,则进行进一步的访问决策
  7.             $accessGuid   =   md5($appName.MODULE_NAME.ACTION_NAME);
  8.             if(empty($_SESSION[C('ADMIN_AUTH_KEY')])) {
  9.                 if(C('USER_AUTH_TYPE')==2) {
  10.                     //加强验证和即时验证模式 更加安全 后台权限修改可以即时生效
  11.                     //通过数据库进行访问检查
  12.                     $accessList = RBAC::getAccessList($_SESSION[C('USER_AUTH_KEY')]);
  13.                 }else {
  14.                     // 如果是管理员或者当前操作已经认证过,无需再次认证
  15.                     if( $_SESSION[$accessGuid]) {
  16.                         return true;
  17.                     }
  18.                     //登录验证模式,比较登录后保存的权限访问列表
  19.                     $accessList = $_SESSION['_ACCESS_LIST'];
  20.                 }
  21.                 //判断是否为组件化模式,如果是,验证其全模块名
  22.                 $module = defined('P_MODULE_NAME')?  P_MODULE_NAME   :   MODULE_NAME;            
  23.                
  24.                 /*  
  25.                  * 若模块节点下未设置操作节点,默认为具有全部操作权限
  26.                  * 相当于仅验证至模块节点,不再继续验证操作节点
  27.                  * modify by jxxysong 2011-12-10
  28.                 */
  29.                 $db    = Db::getInstance();
  30.                         $table = C('RBAC_NODE_TABLE');
  31.                         $sql = "SELECT id, name
  32.                                         FROM ".$table."
  33.                                                 WHERE pid = (
  34.                                                         SELECT id
  35.                                                         FROM xp_node
  36.                                                         WHERE name = '{$module}'
  37.                                                         AND STATUS =1
  38.                                                         AND LEVEL =2 )
  39.                                                 AND STATUS =1
  40.                                                 AND LEVEL =3 ";
  41.                         $nodes = $db->query($sql);
  42.                         if (count($nodes)>0){
  43.                                 $listAccess = $accessList[strtoupper($appName)][strtoupper($module)][strtoupper(ACTION_NAME)];        
  44.                         }else{
  45.                                 $listAccess = $accessList[strtoupper($appName)][strtoupper($module)];
  46.                         }                        
  47.                 /* end modify */
  48.                 if(!isset($listAccess)) {
  49.                     $_SESSION[$accessGuid]  =   false;
  50.                     return false;
  51.                 }
  52.                 else {
  53.                     $_SESSION[$accessGuid]        =        true;
  54.                 }
  55.             }else{
  56.                 //管理员无需认证
  57.                                 return true;
  58.                         }
  59.         }
  60.         return true;
  61.     }
复制代码

作者: jxxysong   发布时间: 2011-12-10