权限菜单的显示

MVC框架:struts2 + spring + hibernate

实现功能:后台管理系统中,每个登录的用户,有多个不同的角色,而每个角色都有不同的权限,针对每个用户所拥有的权限列表,根据其中菜单权限的等级进行划分归类,显示在操作菜单栏中。

菜单结构如下:

权限表设计如下:

       涉及的实体有部门、用户、角色及权限 ,部门-用户 是一对多关系,用户-角色是多对多关系,角色-权限也是多对多关系。在权限表中,权限等级取值可以是 1 、2、3,分别代表一级菜单、二级菜单、三级菜单,父级权限编号可以找到父级权限 ,一级菜单的父级权限默认是0,通过查询这个字段也可以找出某个菜单的子一级菜单列表。

通过这样的设计,就可以在用户登录后,获取用户拥有的所有角色,再根据每个角色拥有的权限进行汇总筛选,去除掉角色之间可能重复的权限,组合成分层次的权限结构,最后返回到页面中,根据权限等级划分层次显示即可。

以下是实体类的代码:

import java.util.List;
import javax.persistence.*;
import org.hibernate.annotations.GenericGenerator;
import com.ylzinfo.psBusiness.app.entity.power.JGInfo;
import com.ylzinfo.psBusiness.app.entity.power.Role;
@Entity
@Table(name="SYS_USER")
public class User {private String userid; // 用户ID(关键字)private String username; // 用户名(用户登录时的用户名 请确保登录名唯一)private String passwd; // 密码private String realname; // 真实姓名private String createtime; // 注册时间private String lastlogontime;// 上次登陆时间private String lockstate; // 账户锁定状态:0正常,1账户停用private String loginedcount; // 已登陆次数private String remark; // 备注private JGInfo baz001;//所属部门private String email;//邮箱地址private String reset_pw;//重置密码验证码(格式:验证码_有效时间)private List<Role> roles;//角色列表public User() {super();}@Id@GeneratedValue(generator = "paymentableGenerator")  @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")public String getUserid() {return userid;}public void setUserid(String userid) {this.userid = userid;}@Column(name="username")public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}@Column(name="passwd")public String getPasswd() {return passwd;}public void setPasswd(String passwd) {this.passwd = passwd;}@Column(name="realname")public String getRealname() {return realname;}public void setRealname(String realname) {this.realname = realname;}@Column(name="createtime")public String getCreatetime() {return createtime;}public void setCreatetime(String createtime) {this.createtime = createtime;}@Column(name="lastlogontime")public String getLastlogontime() {return lastlogontime;}public void setLastlogontime(String lastlogontime) {this.lastlogontime = lastlogontime;}@Column(name="lockstate")public String getLockstate() {return lockstate;}public void setLockstate(String lockstate) {this.lockstate = lockstate;}@Column(name="loginedcount")public String getLoginedcount() {return loginedcount;}public void setLoginedcount(String loginedcount) {this.loginedcount = loginedcount;}@Column(name="remark")public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}@Column(name="email")public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Column(name="reset_pw")public String getReset_pw() {return reset_pw;}public void setReset_pw(String resetPw) {reset_pw = resetPw;}@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "baz001")public JGInfo getBaz001() {return baz001;}public void setBaz001(JGInfo baz001) {this.baz001 = baz001;}@ManyToMany(targetEntity = Role.class, fetch = FetchType.LAZY)  @JoinTable(name = "USER_ROLE", joinColumns = @JoinColumn(name = "USER_ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID")) public List<Role> getRoles() {return roles;}public void setRoles(List<Role> roles) {this.roles = roles;}}
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import org.hibernate.annotations.GenericGenerator;@Entity
@Table(name="SYS_ROLE")
public class Role implements Serializable{/*** */private static final long serialVersionUID = 1L;private String role_id;//角色IDprivate String role_name;//角色名称private Date cre_time;//创建时间private String parent_id;//父级角色IDprivate String describe;//描述private int sort;//排序序号private List<Right> rights;//角色的权限列表@Id@GeneratedValue(generator = "paymentableGenerator")  @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")public String getRole_id() {return role_id;}public void setRole_id(String roleId) {role_id = roleId;}@Column(name="role_name")public String getRole_name() {return role_name;}public void setRole_name(String roleName) {role_name = roleName;}@Column(name="cre_time")public Date getCre_time() {return cre_time;}public void setCre_time(Date creTime) {cre_time = creTime;}@Column(name="parent_id")public String getParent_id() {return parent_id;}public void setParent_id(String parentId) {parent_id = parentId;}@Column(name="describe")public String getDescribe() {return describe;}public void setDescribe(String describe) {this.describe = describe;}@Column(name="sort")public int getSort() {return sort;}public void setSort(int sort) {this.sort = sort;}@ManyToMany(targetEntity = Right.class, fetch = FetchType.LAZY)  @JoinTable(name = "ROLE_RIGHT", joinColumns = @JoinColumn(name = "ROLE_ID"), inverseJoinColumns = @JoinColumn(name = "RIGHT_ID"))  public List<Right> getRights() {return rights;}public void setRights(List<Right> rights) {this.rights = rights;}@Overridepublic String toString() {return "Role [cre_time=" + cre_time + ", describe=" + describe+ ", parent_id=" + parent_id + ", role_id=" + role_id+ ", role_name=" + role_name + ", sort=" + sort + "]";}@Overridepublic boolean equals(Object obj) {// TODO Auto-generated method stubif(obj.getClass() == this.getClass()){if(this.getRole_id().equals(((Role)obj).getRole_id()))return true;elsereturn false;}return super.equals(obj);}}
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;import org.hibernate.annotations.GenericGenerator;@Entity
@Table(name="SYS_RIGHTS")
public class Right implements Serializable{/*** */private static final long serialVersionUID = 1L;private String right_id;//权限IDprivate String right_name;//权限名称private String url;//权限URLprivate String resource_path;//权限图片显示资源路径(可选)private String parent_id;//父级权限IDprivate String describe;//描述private int lev;//权限等级private Integer sort; //排序序号private List<Right> rights;public Right(){rights = new ArrayList();}@Id@GeneratedValue(generator = "paymentableGenerator")  @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")public String getRight_id() {return right_id;}public void setRight_id(String rightId) {right_id = rightId;}@Column(name="right_name")public String getRight_name() {return right_name;}public void setRight_name(String rightName) {right_name = rightName;}@Column(name="url")public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}@Column(name="resource_path")public String getResource_path() {return resource_path;}public void setResource_path(String resourcePath) {resource_path = resourcePath;}@Column(name="parent_id")public String getParent_id() {return parent_id;}public void setParent_id(String parentId) {parent_id = parentId;}@Column(name="describe")public String getDescribe() {return describe;}public void setDescribe(String describe) {this.describe = describe;}@Column(name="lev")public int getLev() {return lev;}public void setLev(int lev) {this.lev = lev;}//@Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性@Transientpublic List<Right> getRights() {return rights;}public void setRights(List<Right> rights) {this.rights = rights;}@Column(name="sort")public Integer getSort() {return sort;}public void setSort(Integer sort) {this.sort = sort;}@Overridepublic String toString() {return "Right [describe=" + describe + ", lev=" + lev + ", parent_id="+ parent_id + ", resource_path=" + resource_path+ ", right_id=" + right_id + ", right_name=" + right_name+ ", url=" + url + "]";}public boolean equals(Right obj) {// TODO Auto-generated method stubif(this.right_id.equals(obj.getRight_id()))return true;elsereturn false;}}

最后是系统确认用户名及密码正确后,需要执行的操作,即加载及筛选合适的权限列表的核心算法。

public void initPower(){//初始化一级菜单List<Role> rlist = user.getRoles();   //获取用户的所有角色List<Right> rightList = new ArrayList();//初始化返回到页面的权限List//遍历每一个角色,并获取每个角色拥有的一级菜单保存到权限列表中for(Role role : rlist){List<Right> rights = role.getRights();for(Right rig : rights){if(rig.getLev() == 1){if(!rightList.contains(rig))rightList.add(rig);}}}//初始化二级菜单//同样遍历角色列表,拿出所有角色的二级子权限放入列表for(Role role : rlist){List<Right> rights = role.getRights();for(Right rig : rights){if(rig.getLev() == 2){for(Right rig2 : rightList){if(rig.getParent_id().equals(rig2.getRight_id())){if(!rig2.getRights().contains(rig))rig2.getRights().add(rig);}}}}}//初始化三级菜单//再次遍历角色列表获取所有三级子权限放入到权限列表中for(Role role : rlist){List<Right> rights = role.getRights();for(Right rig : rights){if(rig.getLev() == 3){for(Right rig2 : rightList){for(Right rig3 : rig2.getRights()){if(rig.getParent_id().equals(rig3.getRight_id())){if(!rig3.getRights().contains(rig))rig3.getRights().add(rig);}}}}}}//根据Right类的sort字段将一级菜单列表由小到大进行排序Collections.sort(rightList, new ComparatorRight());for(Right right:rightList){//对每个一级菜单的二级子菜单进行排序Collections.sort(right.getRights(),new ComparatorRight());for(Right right2:right.getRights()){//对每个二级菜单的三级子菜单进行排序Collections.sort(right2.getRights(),new ComparatorRight());}}//将用户所拥有的菜单权限列表保存到Session中request.getSession().setAttribute("rights", rightList);}

权限管理设计之菜单权限相关推荐

  1. 通用权限管理设计 之 数据权限

    阅读目录 前言 初步分析 通用查询机制 数据权限规则 实际应用 结语 前言 前一篇文章<通用权限管理设计 之 数据库设计方案>介绍了[主体]- [领域] - [权限]( who.what. ...

  2. (转)通用权限管理设计 之 数据权限

    转自:leo's Space http://www.cnblogs.com/leoxie2011/archive/2012/03/20/2408542.html 阅读目录 前言 初步分析 通用查询机制 ...

  3. 系统权限管理设计 (转:http://blog.csdn.net/chexlong/article/details/37697555)

    权限设计(转:http://blog.csdn.net/chexlong/article/details/37697555)      1. 前言:      权限管理往往是一个极其复杂的问题,但也可 ...

  4. python通用权限管理框架图_通用权限管理设计篇_设计模式

    摘要: 本文讲的是通用权限管理设计篇_设计模式, 博客地址:http://www.blogjava.net/amigoxie/  一.引言        因为做过的一些系统的权限管理的功能虽然在逐步完 ...

  5. SQL Server:OA权限管理设计的实现 下

    SQL Server:OA权限管理设计的实现 下 OA系统权限管理设计方案      不同职责的人员,对于系统操作的权限应该是不同的.优秀的业务系统,这是最基本的功能.      可以对"组 ...

  6. 系统权限管理设计 (转)

    权限设计(初稿)      1. 前言:      权限管理往往是一个极其复杂的问题,但也可简单表述为这样的逻辑表达式:判断"Who对What(Which)进行How的操作"的逻辑 ...

  7. 通用权限管理设计篇_设计模式

    摘要: 本文讲的是通用权限管理设计篇_设计模式, 博客地址:http://www.blogjava.net/amigoxie/  一.引言        因为做过的一些系统的权限管理的功能虽然在逐步完 ...

  8. (转)通用权限管理设计 之 数据库结构设计

    转自:leo's Space http://www.cnblogs.com/leoxie2011/archive/2011/05/19/2050626.html 通用权限管理设计 之 数据库结构设计 ...

  9. AdminEx后台管理系统模板、用户权限管理设计、按钮级别

    一.前言 最近有时间研究了一下做后台管理系统的模板界面,开源的比较知名很早之前就用过EasyUI.Vue+ElementUI,Layui,Bootstrap等. EasyUI个人感觉功能强大,帮助we ...

最新文章

  1. AWS — AWS 上的 MEC
  2. 线性变化和非线性变化
  3. Python代码打印出9*9 九九乘法表
  4. 黑马程序员-面向对象-06天-5(单例设计模式)
  5. vm服务器虚拟化如何漂移,解决虚拟机漂移问题的自动化网络管理
  6. java final const_Java 中的final 和C++ 中的const 有什么区别?
  7. 屏幕距离和坐便转换工具_【软件推荐】你和大神的距离,只差这几个效率工具!...
  8. 鼠标触碰元素时变为其它各种形状
  9. L2-007 家庭房产(并查集)
  10. Android数据库一些源码分析
  11. Python爬取网易云热歌榜所有音乐及其热评
  12. 对数坐标归一化_数据归一化处理方法 数据处理之标准化/归一化方法
  13. 常见运维监控系统的技术选型
  14. 腾讯出了一款AI产品,早期癌症筛查准确率最高达90%
  15. 二阶矩阵特征值与特征向量的计算matlab程序(可指定计算精度)
  16. 成倍提升ORM系统SQL性能的一个方法
  17. mac 您没有权限打开应用程序_Mac应用程序无法打开或文件损坏的处理方法
  18. 中国大学MOOC C语言程序设计(大连理工大学) 课后编程题 第十一周题解(个人向仅供参考)
  19. Debug和release版本区别 原码反码补码的转换及存储
  20. PAT.A1010 Radix

热门文章

  1. 关系数据库理论-范式
  2. 红色卡通感恩节感谢有你节日介绍PPT模板
  3. Unity Hub安装Android环境 (Unity2019及以上支持)
  4. 把电脑磁盘克隆到u盘里,磁盘如何克隆到u盘
  5. MySQL存储引擎介绍及区别
  6. S9全球总决赛全网直播,腾讯云成最强辅助
  7. 三星语音助手曝光 将与Galaxy S8一同发布
  8. 告诉你架构师与程序员的区别在哪里
  9. 《花束般的恋爱》:用力绽放却注定凋零
  10. php跳转隐藏地址,php 获取跳转的Url真实地址