分组模式下使用RBAC的经验
thinkphp吧
全部回复
仅看楼主
level 1
yxn1910 楼主
根据官方出的thinkphp2.1 RBAC示例和使用说明,依葫芦画瓢,尝试在分组模式下使用RBAC,代码基本照抄,并按自己的需要在数据库中的填写好了数据,可是用户登录后,怎么也不能访问已经分配了权限的模块和方法(操作),trace信息只是提示RBAC.class.php执行过程中遇到了未定义的方法,用NetBeans加上xdebug进行跟踪调试,发现没有的获得模块的名称。
记得论坛中有朋友说:阅读源代码是最好的学习途径。于是打开RBAC.class.php文档,阅读到第168行,看到AccessDecision方法,
恍然大悟,该方法有一个可选的参数,默认值是常量APP_NAME,而分组模式下则用常量GROUP_NAME获得当前分组名称。这个细节在官方的RBAC使用说明中没有提到。
查到了原因,问题就很容易解决了。在初始化权限验证的方法中,在调用AccessDecision时都加上GROUP_NAME参数。
附上初始化权限验证的代码,方便和官方示例中的代码对照:
01.//所有权限验证的模块都需要继承这个类
02.class BaseAction extends Action {
03.function _initialize() {
04. dump($_SESSION);
05. header("Content-Type:text/html; charset=utf-8");
06. if (C('USER_AUTH_ON') && !in_array(MODULE_NAME, explode(',', C('NOT_AUTH_MODULE')))) {
07. //调用thinkphp自带的RBAC类
08. import('ORG.Util.RBAC');
09. //通过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的源代码,或许更容易找到出错的原因。
2011年07月28日 14点07分 1
level 1
谢谢楼主分享
2012年01月08日 17点01分 2
level 1
在制作节点时,项目 和分组是不是pid都属于0
2012年08月07日 04点08分 3
1