基于数据库的权限系统设计

上传人:第*** 文档编号:38762671 上传时间:2018-05-07 格式:DOCX 页数:25 大小:902.30KB
返回 下载 相关 举报
基于数据库的权限系统设计_第1页
第1页 / 共25页
基于数据库的权限系统设计_第2页
第2页 / 共25页
基于数据库的权限系统设计_第3页
第3页 / 共25页
基于数据库的权限系统设计_第4页
第4页 / 共25页
基于数据库的权限系统设计_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《基于数据库的权限系统设计》由会员分享,可在线阅读,更多相关《基于数据库的权限系统设计(25页珍藏版)》请在金锄头文库上搜索。

1、这一天将讲述一个基本的基于数据库的权限管理系统的设计,在这一天的课程 的最后将讲述“左右值无限分类实现算法”如何来优化“系统菜单”的结构而 告终。今天的内容和前几天的基础框架是一样的它们都属于基础知识,在这些 基础知识上还可以扩展出无数的变种与进化设计。二、先来看客户的一个需求二、先来看客户的一个需求2.12.1 用户实际需求用户实际需求1. 所有的用户、角色可动态配置2. 所有的系统菜单的权限要求具体到“增,删,改、查、打印、导出” 这样的小权限的设计3. 所有的权限基于角色来进行划分和判断4. 一个用户可能属于多个角色5. 系统菜单也能够动态的“增、删、改、查”2.22.2 系统权限菜单样

2、例系统权限菜单样例三、基于数据库的系统权限表设计三、基于数据库的系统权限表设计3.13.1 ER(EntityER(Entity Relationship)Relationship)图图围绕上述需求,我们可以在数据库内进行如下的表设计,下面直接给出 ER 图:3.23.2 表关系详解表关系详解上述设计有 6 张表,其中:T_UserT_User 表表用于存放用户信息,此处只存放基础信息T_RoleT_Role 表表用于存放系统角色信息T_User_RoleT_User_Role 表表用于存放系统用户与角色的匹配关系T_Sys_MenuT_Sys_Menu 表表这张就是用于存放系统菜单的表了,这

3、张表的设计主要使用了如下的表设计技 巧:注意这边的 MENU_ID 与 MENU_PID如果这个菜单项是一级菜单,那么我们把它的 MENU_PID 设为 0如果这个菜单是另一个菜单的子菜单,那么我们就把它的 MENU_PID 设为它的父 菜单的 MENU_ID。有了这样的结构,我们一个递归就能把这颗“树”显示出来了,是不是?此处以 Oracle 数据库为例,不使用递归,直接把树形结构在数据库中就造型造 好(当然,还有更好的方法如:当然,还有更好的方法如:有人喜欢设有人喜欢设 levellevel 或者是或者是 deepdeep 这样的字段来简这样的字段来简 化程序解析树型结构菜单化程序解析树型

4、结构菜单,稍后我们会来讲一个根本不需要用递归的树型菜单稍后我们会来讲一个根本不需要用递归的树型菜单 的设计来最大程度优化设计的设计来最大程度优化设计。)显示整颗树型菜单结构的显示整颗树型菜单结构的 OracleOracle 语句:语句: SELECT *FROM T_SYS_MENUSTARTWITH MENU_PID=0CONNECTBYPRIOR MENU_ID=MENU_PIDorderby MENU_ID上述语句,已经用数据查询用句就将我们的这个“树”的层次关系理出来了, 如果我们手上有一个控件叫 dtree.js,那么一个循环就可以把这个树显示出来 了,不是吗?来看来看 dtree.

5、jsdtree.js 的应用的应用/公式: d.add(menu_id, menu_pid, menudescr, menu_url);d = new dTree(d);d.add(0,-1,菜单);d.add(1,0,报表查询,example01.html);d.add(2,1,月报,example01.html);d.add(3,1,季报,example01.html);d.add(4,1,年报,example01.html);d.add(5,0,系统管理,example01.html);d.add(6,5,用户管理,example01.html);d.add(7,6,新增用户,examp

6、le01.html);d.add(8,6,删除用户,example01.html);d.add(9,5,角色管理,example01.html);d.add(10,9,新增角色,example01.html);d.add(11,9,删除角色,example01.html)document.write(d);大家看上面,这个是 dtree.js 插件,一个专门用于生成树的 js 插件的使用方 法,那么如果我们附以上述的 sql 语句在数据库中把数据选出来后,是不是只 要一个循环就可以给这个 dtree.js 插件显示了,不是吗?我们如果不想显示整颗树只想显示如:只显示系统管理菜单有其下列所有的子

7、菜单,那么我们的 Oracle 中的 Sql 应该 怎么写呢?经查“系统管理”这个菜单的 MENU_ID=105,于是我们的 Sql 语句如下:SELECT *FROM T_SYS_MENUSTARTWITH MENU_ID=105CONNECTBYPRIOR MENU_ID=MENU_PIDorderby MENU_ID对吧?很简单哈!T_PrivilegeT_Privilege 表表用于存放系统每个菜单的详细子权限如“增,删,改,查”T_Menu_PrivilegeT_Menu_Privilege 表表这张表就是我们的最终终结大 BOSS 表,它里面是一个完整的系统权限与角色关 系间的对应

8、。比如说:我们想要知道“user”这个角色,可以操作哪些菜单,哪些权限,那么我们的 SQL 语句如下:selectdistinct m.menu_id,m.menu_descr,m.menu_url,m.menu_pid,p.privilege_id,p.privile ge_type fromt_menu_privilege mp,t_sys_menu m,t_privilege p,t_user_role rwheremp.privilege_id=p.privilege_idand mp.role_id=r.role_idand mp.menu_id=m.menu_idand r.rol

9、e_id=userorderby m.menu_id通过这个结果我们就知道了1. 角色“user”能操作哪些菜单2. 角色“user”对某个菜单具有什么样的权限进而,我们可以推出:进而,我们可以推出:我们想要知道 Danzel 这个人,可以操作哪些菜单,以及在哪些菜单上有哪些可 供操作的权限,我们使用如下的 SQL 语句:selectdistinct m.menu_id,m.menu_descr,m.menu_url,m.menu_pid,p.privilege_id,p.privile ge_type fromt_menu_privilege mp,t_sys_menu m,t_privil

10、ege p,t_user_role rwheremp.privilege_id=p.privilege_idand mp.role_id=r.role_idand mp.menu_id=m.menu_idand r.user_id=Danzelorderby m.menu_id;通过这个结果我们就知道了1. Danzel 这个人能操作哪些菜单2. Danzel 对某个菜单具有什么样的权限3.33.3 界面制作界面制作关于 jsp,什么 dao 层,service 层的具体代码这个就不讲了,这个没有意义的 哦,我们来讲设计。登录后如何显示左边的树型菜单:登录后如何显示左边的树型菜单: 取得用户名

11、 将该用户名作为参数 input 进如下的 SQL 语句得到该用户在登录后可以看 到的系统菜单:selectdistinct m.menu_id, m.menu_descr, m.menu_url, m.menu_pidfromt_menu_privilege mp,t_sys_menu m,t_privilege p,t_user_role rwheremp.privilege_id=p.privilege_idand mp.role_id=r.role_idand mp.menu_id=m.menu_idand r.user_id=DanzelSTARTWITH MENU_PID=0CON

12、NECTBYPRIOR M.MENU_ID=M.MENU_PIDorderby M.MENU_ID将该结果直接给于 index.jsp 页面上的 dtree.js 组件,一个循环,所有菜单曾 树形显示。知道用户登录后能够对哪些菜单,并且在相关界面操作时有哪些子权限如:增、知道用户登录后能够对哪些菜单,并且在相关界面操作时有哪些子权限如:增、 删、改、查、打印、报表的设计:删、改、查、打印、报表的设计: 在登录时得到用户名等信息,然后将该用户名作为参数 input 进入如下的 sql 语句:selectdistinct m.menu_id,m.menu_descr,m.menu_url,m.me

13、nu_pid,p.privilege_id,p.privile ge_type fromt_menu_privilege mp,t_sys_menu m,t_privilege p,t_user_role rwheremp.privilege_id=p.privilege_idand mp.role_id=r.role_idand mp.menu_id=m.menu_idand r.user_id=Danzelorderby m.menu_id; 得到上述结果后,使用:Haspmap这样的 结构将该用户所属的角色分对每个菜单有哪些操作(增、删、改、查、打印、 报表)进行存储,放入用户的 ses

14、sion 中,在 以后用户在每个界面进行点击动 作时进行判断,或者可以写个 filter 来进行判断,是不是就可以作到:知道该登录用户在登录后可以对哪些菜单进行操作,并且拥有什么操作权限啦?相应的我们还需要制作如下的界面:相应的我们还需要制作如下的界面: 用户的管理界面 角色的管理界面 用户与角色的分配界面 系统菜单的管理界面 具体权限项的管理界面 系统菜单与角色间具体的权限分配界面好了,有了这些界面,一个完整的基于数据库引擎的权限系统算是完成了。严重注意:严重注意:在制作“系统菜单与角色间具体的权限分配界面”时,如果在界面上把某个角 色对该条菜单的“查看”这个选项 disable 后,那么该

15、角色将不拥有任何该菜 单的所有权限,举例:某角色对菜单 A 拥有如下权限:增、删、改、打印但是这个“查看”权限没有,也有可能是管理员误操作,但是从真实情况我们 来说,这个角色连“查看”的权限都没有,连菜单都进不了,他能做什么“增、 删、改。”等其它的操作啊?操作个头啊!是吧?所以一旦界面上该角色对某个系统菜单没有了查看权限后,它对这个菜单的其一旦界面上该角色对某个系统菜单没有了查看权限后,它对这个菜单的其 它权限也必须从它权限也必须从 T_MENU_PRIVILEGET_MENU_PRIVILEGE 这个表中删除。这个表中删除。四、改进四、改进 T_SYSTEM_MENUT_SYSTEM_ME

16、NU 表的设计表的设计前面我们用的是 Oracle 特有的递归 SQL 将树形菜单在从数据库中选取出来时就 已经是一颗树的结构了,但是像 MYSQL,SQL SERVER, DB2 等可能不带有这样 的特 SQL,那就需我们自己动手去写递归,还有就是很多工程用的是 jquery 的 tree 或者是其它相关的 ajax tree,这些 tree 都需要用到一个字段叫 level(此处指深度、层次的意思),如果按照原来的表结构,要取得这个 level,恐怕是要写递归算法 了。就算有些数据库有类似的语句,那也需要你 去修改你的 SQL 语句从未影响了性能与通用性。我们在这边说,我们无论什么数据库,如果都用相同的 SQL 就能把我们需要的 东西在数据库中就排好树形结构然后一

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号