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表:


ThinkPHP3 中APP_GROUP_LIST分组后RBAC无权限问题解决办法!!!_第1张图片
 
以下 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',

这句话不知道是否有用,未测试。

 

补全下:

还有两个地方要注意,一个就是数据库node表里要把level=1的需要添加相应名称的分组名例如Admin,另外就是
CommonAction中,需要添加GROUP_NAME,今天测试独立分组的RBAC,已经成功啦,哇咔咔。。。。。

 

class CommonAction extends Action {

    function _initialize() {
        import('@.ORG.Util.Cookie');
        // 用户权限检查
        if (C('USER_AUTH_ON') && !in_array(MODULE_NAME, explode(',', C('NOT_AUTH_MODULE')))) {
            import('@.ORG.Util.RBAC');
            if (!RBAC::AccessDecision(GROUP_NAME)) {
 

你可能感兴趣的:(分组,thinkphp,rbac,ThinkPHP3.0,无权限)