+ -
当前位置:首页 → 问答吧 → 关于对RBAC的一点小改进

关于对RBAC的一点小改进

时间:2011-12-10

来源:互联网

  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. * modify by jxxysong 2011-12-10
  27. */
  28. $db = Db::getInstance();
  29. $table = C('RBAC_NODE_TABLE');
  30. $sql = "SELECT id, name
  31. FROM ".$table."
  32. WHERE pid = (
  33. SELECT id
  34. FROM xp_node
  35. WHERE name = '{$module}'
  36. AND STATUS =1
  37. AND LEVEL =2 )
  38. AND STATUS =1
  39. AND LEVEL =3 ";
  40. $nodes = $db->query($sql);
  41. if (count($nodes)>0){
  42. $listAccess = $accessList[strtoupper($appName)][strtoupper($module)][strtoupper(ACTION_NAME)];
  43. }else{
  44. $listAccess = $accessList[strtoupper($appName)][strtoupper($module)];
  45. }
  46. /* end modify */
  47. if(!isset($listAccess)) {
  48. $_SESSION[$accessGuid] = false;
  49. return false;
  50. }
  51. else {
  52. $_SESSION[$accessGuid] = true;
  53. }
  54. }else{
  55. //管理员无需认证
  56. return true;
  57. }
  58. }
  59. return true;
  60. }
复制代码
我现在研究的TP后台的模块比较多,有些模块权限又不想继续细化到操作权限上。
我对RBAC进行了一点小的修改,基本实现了目的,看看大家有什么斧正之处不?!
我的想法是:进行节点表的判断,如果模块(level=2)下没有操作(level=3),就只验证到模块段即可。

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

这种思路我以前实现过,的确有些系统中无需细化到操作级别,希望还有好的方法实现

作者: izyue   发布时间: 2011-12-11