树形菜单的权限控制是个蛋疼的问题【讨论】
想必,做树权限应该是经常碰到的头痛问题,寻求最佳实现!!
前提是这样的:
现有一已经实现的树形导航,每个节点(包括子节点父节点)都对应了一个页面(如有需要父节点可以设计为不对应页面),树形结构以节点为描述存入数据库,一条节点数据库描述如下:
节点{节点id,父节点id,是否有子节点,子节点个数,其它}
从节点描述可以看出每个节点只知道它的父节点是谁,知道自己有没有子节点,并不知道它的爷爷和儿子具体是谁(当然我们可以用父节点id作为查询条件从而得知“父节点”的子节点有哪些)。
前台js已实现根据节点数据自动通过父子关系组装显示整个树。
需求:
(1)现在要对这棵树做权限控制,实现不同的人看到不同的树型导航,也就是如果用户对某个节点没有权限那么次节点对此用户不显示(这里的不显示是指后台没有读出此节点的数据库数据给前台,而不是前台通过js隐藏)
(2)树节点比较多,不宜过多操作数据库。
(3)权限系统希望独立出去,也就是不能在节点数据库表结构上添加其它列
(4)全线系统可以建立自己的数据库表
(5)权限系统可以读取节点信息表和用户表(用户表归权限系统)但是不能修改其信息
(6)全线系统要达到:能给用户配置指定节点的权限(暂定只有访问权限)
可以任意发挥!可以任意添加表!可以任意添加逻辑!只要不改变节点表。
大体思路:
登录部分:
用户登录系统 -> 将用户名、密码发送到权限系统 -> 权限系统返回是否允许登录
树生成部分:
系统将用户名发到权限系统 -> 权限系统返回其可访问的节点信息【1】 -> 系统根据节点信息组装树【2】
问题来了:
(1)建立什么样的权限系统表结构(包括用户表)来映射用户和树节点表最好?
(2)在【1】处用什么样的算法达到迅速读取某用户对应的节点信息?
(3)在【2】处要组装完整的树光有子节点是不行的,还必须查处它的父节点和爷爷节点直到树根,不然树是断开的无法组装树。
其实如果能写出一个这样的sql就能解决了,这个sql能查出某个用户有权的树节点,并能根据这些节点查出其父节点,再根据父节点查出爷爷节点。。。直到树根。但是这样的查询速度会不会很慢?有什么更好的方法么?
想必做树权限应该是经常碰到的头痛问题,寻求最佳实现,欢迎大家讨论!