关于RBAC类在SQLServer数据库下无法获取权限列表的一点看法

浏览:859 发布日期:2015/05/22 分类:求助交流 关键字: RBAC SQLServer 权限列表
最近在使用TP框架做项目,框架版本是3.2.2,数据库采用的是SQLServer,服务器用的是Centos,在用到RBAC权限类库时,发现使用saveAccessList()方法总是获取不到结果,打印出来的结果一直都为空。检查过配置项,并没有发现什么问题,于是通过代码追踪,找到了Rbac.class.php文件中的saveAccessList()方法,该方法调用了getAccessList()方法,于是继续追踪,在看到getAccessList()方法中的sql语句时,发现了一点问题(getModuleAccessList()方法中的sql也有这个问题,具体见Rbac.class.php文件),代码如下:$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";
发现sql里面的$table['user']." as user,"采用了别名为user,于是打印出实际运行时的语句放入SQLServer中运行,会发现SQLServer提示错误信息。错误信息如下:

ErrorCode: -2146232060
[.Net SqlClient Data Provider]
Number: 156, Class: 15, State: 1, Line: 2
ErrorMessage: 关键字 'user' 附近有语法错误。

其中最后一行提到了错误原因,查了一下SQLServer的说明,似乎user是SQLServer中的一个关键字(也可能是已经被定义过的变量,具体深层次没去琢磨),当使用user作为别名使用时,会出现该问题。手动改写成非user变量后(如users等),则能获取到相应结果。

更改后:$sql    =   "select node.id,node.name from ".
                    $table['role']." as role,".
                    $table['user']." as 这里自定义一个别名(如users),".
                    $table['access']." as access ,".
                    $table['node']." as node ".
                    "where 自定义别名.user_id='{$authId}' and 自定义别名.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";
补充:
我从官网上下载了3.2.3的TP代码,发现Rbac.class.php文件中的sql语句还是和上面sql编写的一样,在SQLServer下依旧无法获取到结果。我在MySQL数据库中试了下,使用该sql获取应该是没问题,Oracle等其他数据库没试过,个人拙见,或许有什么纰漏也不一定,仅提供给跟我一样遇到无法获取权限的朋友们一点参考。
最佳答案
评论() 相关
后面还有条评论,点击查看>>