优秀的编程知识分享平台

网站首页 > 技术文章 正文

SSM框架权限,如何列表级别权限管理,使用resultMap实现权限管理

nanyue 2024-07-26 16:00:05 技术文章 5 ℃

基础权限管理笔记终章

之前两篇关于Filter实现权限登录和权限校验的笔记已经更完了

最后,整理一下对于页面显示的权限管理实现(列表)

没有太高的技术含量,对于一些比较小的项目像是一些办公管理系统之类的足够用了,利用Filter对源代码入侵也比较少,使用配置方便,毕竟不是大项目,不喜勿喷

最终效果:用户登录系统直接显示权限范围内的操作菜单,其他不显示

 private static final long serialVersionUID = -3908225168044626931L;
 private int id;
 private String loginname;
 private String realname;
 private String sex;
 private Date birthday;
 private Tdept dept;
 private int dep;
 private String email;
 private int isenabled;
 private String password;
 private int creator;
 private Date createtime;
 private int updator;
 private Date updatetime;
 private String picurl;
 private String isenabledtText;
 private String birthdayText;
 private List<TPermission> permissions;
 //初始化菜单
 private List<TPermission> menu = new ArrayList<>();
 public List<TPermission> getMenu() {
 //查询添加之前清空菜单
 menu.clear();
 for (TPermission per1 : permissions) {
 //查询添加前清空菜单
 per1.getChildren().clear();
 //是一级菜单
 if (per1.getPid() == 0) {
 //装载一级菜单下的二级菜单
 for (TPermission per2 : permissions) {
 //权限的上级id等于一级菜单id
 if (per2.getPid() == per1.getId()) {
 per1.addChild(per2);
 }
 }
 menu.add(per1);
 }
 }
 return menu;
 }
private static final long serialVersionUID = 8901347022172970844L;
 private int id;
 private String pname;
 private int pid;
 private String url;
 private int lev;
 private int sort;
 private int isleaf;
 private String npic;
 //初始化子权限
 private List<TPermission> children=new ArrayList<>();
 //一个一个的加进去
 public void addChild(TPermission per){
 	children.add(per);
 }

两个实体类,一个是用户类,一个是权限类

数据库创建用户表,权限表,角色表,用户角色表,角色权限表

通过名字不难看出

用户表与权限表是通过角色和外键来实现关联的

具体见下图

Dao包接口

public interface UserDao {
	//检查登录
	TUser queryByLogin(LoginBean login)throws SysException;
}

Dao.xml中的mapper映射

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 映射指向dao接口 -->
<mapper namespace="com.tjzs.sccms.dao.UserDao">
	<!-- 结果映射 -->
	<resultMap type="TUser" id="usermap">
		<!-- 主键 -->
		<id column="id" property="id" />
		<collection property="permissions" column="id" select="getPermissions"
			ofType="Tpermission" />
	</resultMap>
	
	<!-- 根据用户名和密码查询用户 -->
	<select id="queryByLogin" parameterType="LoginBean" resultType="TUser">
		select * from tuser where loginname=#{loginname} and
		password=#{password}
	</select>
	<!-- 根据用户id查询用户权限 -->
	<select id="queryById" parameterType="int" resultMap="usermap">
		select * from tuser where id=#{id}
	</select>
	<!-- resultmap中调用的查询用户权限的方法 -->
	<select id="getPermissions" parameterType="int" resultType="TPermission">
		select * from TPERMISSION t where id in
		(select pid from TROLEPERMISSION t where rid in
		(select rid from TUSERROLE t where usid=#{id} ))
	</select>
</mapper>

在根据用户查询权限的时候使用resultmap

在resultmap中配置一对多的查询

然后在Service的部分去进行逻辑处理

public TUser chkLogin(String loginname, String password) throws SysException {
		// TODO Auto-generated method stub
		LoginBean login=new LoginBean();
		login.setLoginname(loginname);
		if(password.length()!=32){
			MD5 m=new MD5();
			login.setPassword(m.getMD5ofStr(password));
		}else {
			
			login.setPassword(password);
		}
		TUser user=dao.queryByLogin(login);
		if(user==null){
			throw new SysException("对不起,用户名或者密码不正确请重新输入",100);
		}
		//获得带权限列表的user
		TUser user2=dao.queryById(user.getId());
		return user2;
	}

最后在控制层去调用方法

这样返回的用户本身就已经是带有权限列表了

对于菜单的生成,在开始创建pojo的对象原型的时候就已经写好逻辑

//初始化菜单
 private List<TPermission> menu = new ArrayList<>();
 public List<TPermission> getMenu() {
 //查询添加之前清空菜单
 menu.clear();
 for (TPermission per1 : permissions) {
 //查询添加前清空菜单
 per1.getChildren().clear();
 //是一级菜单
 if (per1.getPid() == 0) {
 //装载一级菜单下的二级菜单
 for (TPermission per2 : permissions) {
 //权限的上级id等于一级菜单id
 if (per2.getPid() == per1.getId()) {
 per1.addChild(per2);
 }
 }
 menu.add(per1);
 }
 }
 return menu;
 }

也就是初始化菜单的部分

最后在前台显示调用

<body>
<table width="100%" height="280" border="0" cellpadding="0" cellspacing="0" bgcolor="#EEF2FB">
 <tr>
 <td width="182" valign="top">
 
 <div id="container">
 <c:forEach items="${MENU }" var="m1">
 <h1 class="type"><a href="javascript:void(0)">${m1.pname }</a></h1>
 <div class="content">
 <table width="100%" border="0" cellspacing="0" cellpadding="0">
 <tr>
 <td><img src="images/menu_topline.gif" width="182" height="5" /></td>
 </tr>
 </table>
 <ul class="MM">
 <c:forEach items="${m1.children }" var="m2">
 	<li><a href="${m2.url }" target="mainFrame">${m2.pname }</a></li>
 </c:forEach> 
 </ul>
 </div>
 
 </c:forEach>
 </div>
 <script type="text/javascript">
		var contents = document.getElementsByClassName('content');
		var toggles = document.getElementsByClassName('type');
	
		var myAccordion = new fx.Accordion(
			toggles, contents, {opacity: true, duration: 400}
		);
		myAccordion.showThisHideOpen(contents[0]);
	</script>
 </td>
 </tr>
</table>
</body>

到此大功告成

很简单的实现有木有

现在看来真的是,以前刚接触的时候一直都是蒙蔽的状态

似懂非懂,最近温习基础,稍微看了下

呵呵,好吧,还是很有用的,可以作为一个简单的参考

本文章仅作为个人笔记发出来分享

很基础入门的东西

大神们绕过

新童鞋不喜勿喷,哈哈

SSM框架Filter登录后对权限进行甄别,没有权限不可访问指定页面

SSM框架利用Filter实现页面不登陆拦截,禁止跳过登录强制访问

最近发表
标签列表