Rumah >pembangunan bahagian belakang >tutorial php >ThinkPHP3 中APP_GROUP_LIST分组后RBAC无权限有关问题解决方法!
ThinkPHP3 中APP_GROUP_LIST分组后RBAC无权限问题解决办法!!!
转载请注明出处:http://tyllxx.iteye.com/blog/1693553
今天在官网下的rbac示例,解压出来放到网站根目录,配合TP3.1的框架,运行正常,进入也正常。权限也正常,数据库无问题。
将配置文件改名为config.inc.php,放在App目录下,配置文件中加入
? ?? ???'APP_GROUP_LIST'=>'admin,member',
? ?? ???'DEFAULT_GROUP'=>'',
采用分组后Conf文件夹下新建admin,member文件夹,目录中包含config.php,Conf文件夹下也含config.php(不是原先的),内容如下:
$config=require './App/config.inc.php';
$array=array();
return array_merge($config,$array);
转载请注明出处:http://tyllxx.iteye.com/blog/1693553?
CommonAction文件中:
if (!RBAC::AccessDecision(GROUP_NAME)) {//增加GROUP_NAME参数
\Lib\Action文件夹下新建admin,member文件夹,复制\Lib\Action文件夹下IndexAction.class.php文件到新建的admin,member两个文件夹中。
\Tpl文件夹下新建admin,member文件夹,复制\Tpl文件夹下Index文件夹到新建的admin,member两个文件夹中。
配置数据库中权限(为了方便测试删除了数据表中原有的权限):
?
以下node表:
?
以下?access表:
?
?
以下role表:
以下role_user表:
按照以上方式配置登录成功,但是提示无权限!
?
?
目前找到的解决办法是:
修改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);转载请注明出处:http://tyllxx.iteye.com/blog/1693553
?
其中的:
"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";
?
就可以正确识别分组后的权限。。。。
?
配置文件中
'RBAC_GROUP_NAME'=>'admin,member',
这句话不知道是否有用,未测试。
?