+ -
当前位置:首页 → 问答吧 → 分组模式下使用RBAC的经验

分组模式下使用RBAC的经验

时间:2011-05-04

来源:互联网



根据官方出的thinkphp2.1 RBAC示例和使用说明,依葫芦画瓢,尝试在分组模式下使用RBAC,代码基本照抄,并按自己的需要在数据库中的填写好了数据,可是用户登录后,怎么也不能访问已经分配了权限的模块和方法(操作),trace信息只是提示RBAC.class.php执行过程中遇到了未定义的方法,用NetBeans加上xdebug进行跟踪调试,发现没有的获得模块的名称。
记得论坛中有朋友说:阅读源代码是最好的学习途径。于是打开RBAC.class.php文档,阅读到第168行,看到AccessDecision方法,
恍然大悟,该方法有一个可选的参数,默认值是常量APP_NAME,而分组模式下则用常量GROUP_NAME获得当前分组名称。这个细节在官方的RBAC使用说明中没有提到。
查到了原因,问题就很容易解决了。在初始化权限验证的方法中,在调用AccessDecision时都加上GROUP_NAME参数。
附上初始化权限验证的代码,方便和官方示例中的代码对照:
  1. //所有权限验证的模块都需要继承这个类
  2. class BaseAction extends Action {
  3. function _initialize() {
  4.         dump($_SESSION);
  5.         header("Content-Type:text/html; charset=utf-8");
  6.         if (C('USER_AUTH_ON') && !in_array(MODULE_NAME, explode(',', C('NOT_AUTH_MODULE')))) {
  7.             //调用thinkphp自带的RBAC类
  8.             import('ORG.Util.RBAC');
  9.             //通过RBAC类中的AccessDecision获取与权限相关的信息,如果没有获取到则执行以下部份
  10.             if (!RBAC::AccessDecision(GROUP_NAME)) {
  11.                 //获取SESSION中的用户标识号,如果没有则用户没有登陆跳转到login页面
  12.                 if (!$_SESSION[C('USER_AUTH_KEY')]) {
  13.                     $this->assign('jumpUrl', __APP__ . C('USER_AUTH_GATEWAY'));
  14.                     $this->error('没有登录!请重新登录');
  15.                    // redirect(PHP_FILE . C('USER_AUTH_GATEWAY'));
  16.                 }
  17.                 if (C('RBAC_ERROR_PAGE')) {
  18.                     // 定义权限错误页面
  19.                     //redirect(PHP_FILE . C('RBAC_ERROR_PAGE'));
  20.                     $this->assign('jumpUrl', __APP__ . C('RBAC_ERROR_PAGE'));
  21.                     $this->error('对不起,没有权限');
  22.                     //redirect(C('RBAC_ERROR_PAGE'));
  23.                 } else {
  24.                     //检测是否开始了游客认证方式
  25.                     if (C('GUEST_AUTH_ON')) {
  26.                         $this->assign('jumpUrl', PHP_FILE . C('USER_AUTH_GATEWAY'));
  27.                     }
  28.                     // 提示错误信息
  29.                     $this->error(L('_VALID_ACCESS_'));
  30.                 }
  31.             }
  32.         }
  33.     }
  34. }
复制代码
经验总结:阅读一下thinkphp的源代码,或许更容易找到出错的原因。

作者: w_jm   发布时间: 2011-05-04

现在的RBAC真是比较弱,求强化。

作者: vus520   发布时间: 2011-05-04