如果想要获取相关的源码,笔记,和相关工具,对项目需求的二次开发,可以关注我并私信!!!
四 权限管理(用户授权)的应用:根据用户的角色显示不同用户的权限菜单
经过上面的与第三方系统的成功的接入,而且在“角色管理”菜单中也对需要授权的角色进行了授权--->给一级菜单和二级菜单授权给了卫生室,那么,接下来就需使用卫生室登录系统,看看页面中的导航菜单中是否显示了添加的一级菜单和二级菜单导航菜单!
简单说,本节中所要实现的功能是:验证用户的权限菜单!就是使用不同的用户登录系统,并根据用户的角色获取他的权限菜单,并在左侧页面中的导航栏中显示!
即:根据不同用户的登录来显示不同用户的菜单!
举例来说:使用卫生局和卫生室两个角色分别登录系统,在导航栏中的权限菜单的显示也是不同的!
因此,first.jsp页面中发送的请求中的Menu.json文件可以不需要了!同时,本节的内容需要和第7节的内容分步来实现权限管理的应用的!
该节内容总结就是:
用户登录成功后,根据用户所属的角色来从数据库中查出用户的菜单权限,然后将菜单权限存储至session中,从而实现不同的用户登录,显示出不同的菜单!
因此,也可以说菜单权限属于粗颗粒度的权限管理范畴!
1 DAO
1.1 sql语句的编写(有难度)
再次强调:在写sql语句之前,必须要对这9张表之间的关系烂熟于心:
这9张表之间的关系可以参考“第三方用户授权系统表关系.xlsx”文件,或者参考“本系统的权限管理模型”一节中的内容和视频!!
需求:根据用户角色获取该角色下所有的一级和二级菜单。注意:是所有的一级和二级菜单,而不是某个一级菜单下的二级菜单!这样做是为了节省性能。
主查询表:权限菜单表bss_sys_module表可以查看所有的一级菜单和二级菜单,它是一个树形结构。其中parentid字段值为0表示一级菜单,而parentid的值中不为0的都是二级菜单,并且,所有的二级菜单中都有url链接地址.
如下图:
关联查询表:角色表、角色系统关系表、角色节点关系表、角色菜单关系表、角色操作关系表。
--查询某个卫生室下的所有一级和二级菜单 select m1.moduleid menuid, m1.name menuname, m2.moduleid menuid_two, --之所以别名是menuid_two,而不是menuid.是因为mybatis对于结果集中两个相同的menuid字段是无法实现映射的,虽然这两个字段的内容相同,但是字段名称绝对不可以相同。 m2.name menuname_two, m2.url --这里设定m1中存放的是所有的一级菜单,m2中存放的是所有的二级菜单 from bss_sys_module m1, bss_sys_module m2 --自连接条件 where m2.parentid = m1.moduleid and m1.parentid = '0' --表示所有的一级菜单 and m2.parentid != '0' --表示所有的二级菜单 --该条件用来限定某个角色下所有的二级菜单,因此,范围在m2.moduleid之内 and m2.moduleid in (
---限定某个角色范围内的菜单 select bss_sys_rolemodule.moduleid from bss_sys_role, bss_sys_rolesys, bss_sys_rolenode, bss_sys_rolemodule, bss_sys_roleoperate --角色表和角色系统表的关联 where bss_sys_role.roleid = bss_sys_rolesys.roleid
and bss_sys_rolenode.rsid = bss_sys_rolesys.rsid and bss_sys_rolemodule.rnid = bss_sys_rolenode.rnid and bss_sys_roleoperate.rmid = bss_sys_rolemodule.rmid ---假设角色id是卫生室 and bss_sys_role.roleid = '511A6F41419949C38122A94310DADD14') order by m1.showorder, m2.showorder ---排序,showorder字段是排序字段 |
1.2 VO类的定义
VO的定义--->Menu.java
其中定义的:List<Menu> meus属性中存储的是二级菜单。
这Menu类中属性的定义就是一对多的结构定义。(牢记)!
之所以单独定义一个Menu类,是为了方便直接转换成json格式的数据,因为页面中的权限菜单需要使用JSON格式的数量来显示(这是该系统的开发规范之一)!
(可以参考下面的FirstAction类中的获取菜单方法usermenu()方法会使用到).
1.3 mapper映射文件的定义(一对多查询)
因为是一对多的映射,即:一个用户(角色)对应多个权限菜单,所以必须使用resultMap实现映射。
关于该映射文件中各个属性的含义,请参考“mybatis的高级知识.doc”文档!!!!
在SysuserMapperCustom.xml映射文件中添加如下内容:颜色加深加粗的都是添加的内容。
<!-- 一对多映射 -->
<resultMap id="findMenuByroleidResultMap" type="yycg.base.pojo.vo.Menu">
<!-- column=”menuid”表示唯一的数据库查询语句中的主键。因为在sql语句的结果集中,mybatis会自动把结果集中的menuid主键字段相同的记录进行合并 。-->
<id column=