15、ThinkPHP3.1.3中APP_GROUP_LIST分组后RBAC无权限问题解决办法

阅读() @2018-01-07 22:20:24

今天用ThinikPHP做RBAC权限认证测试,在登录的时候根据用户输入的账号先验证所属角色,然后再根据角色确定其拥有的权限,最后把权限存储在Session中,方便识别。但是遇到一个问题,除了超级管理员之外,其他角色的权限(节点)都无法存储到session中,搞了半天,发现是ThinkPHP框架源码(RBAC.class.php)其中有一段sql语句有误导致的,解决方法如下:

数据表结构如下:

node节点表:

node节点表

access权限表:

access权限表

role角色表:

role角色表

role_user角色_用户中间表:

role_user角色_用户中间表

数据表配置正确,config配置文件里边的配置项也都没问题,普通管理员可以正常登录后台,但就是没有任何权限。

目前找到的解决办法是:修改RBAC主文件:\Lib\ORG\Util\RBAC.class.php,其中通过数据库读取level=1的数据时无法找到匹配值而造成无权限问题。问题语句:

$db     =   Db::getInstance(C('RBAC_DB_DSN'));  
$table = array('role'=>C('RBAC_ROLE_TABLE'),'user'=>C('RBAC_USER_TABLE'),'access'=>C('RBAC_ACCESS_TABLE'),'node'=>C('RBAC_NODE_TABLE'));  
$sql    =   "select node.id,node.name from ".  
            $table['role']." as role,".  
            $table['user']." as user,".  
            $table['access']." as access ,".  
            $table['node']." as node ".  
            "where user.user_id='{$authId}' and user.role_id=role.id and ( access.role_id=role.id  or (access.role_id=role.pid and role.pid!=0 ) ) and role.status=1 and access.node_id=node.id and node.level=1 and node.status=1";  
$apps =   $db->query($sql);  

其中的:

"where user.user_id='{$authId}' and user.role_id=role.id and ( access.role_id=role.id  or (access.role_id=role.pid and role.pid!=0 ) ) and role.status=1 and access.node_id=node.id and node.level=1 and node.status=1";

修改为:

"where user.user_id='{$authId}' and user.role_id=role.id  and role.status=1 and access.node_id=node.id and node.level=1 and node.status=1";
 
这样就可以正确识别分组后的权限。
 
微信二维码
锐壳主机