`
max1487
  • 浏览: 103384 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

权限管理设计之菜单权限

阅读更多

 权限菜单的显示

 

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;//角色ID
	private String role_name;//角色名称
	private Date cre_time;//创建时间
	private String parent_id;//父级角色ID
	private 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;
	}
	@Override
	public String toString() {
		return "Role [cre_time=" + cre_time + ", describe=" + describe
				+ ", parent_id=" + parent_id + ", role_id=" + role_id
				+ ", role_name=" + role_name + ", sort=" + sort + "]";
	}
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		if(obj.getClass() == this.getClass())
		{
			if(this.getRole_id().equals(((Role)obj).getRole_id()))
				return true;
			else
				return 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;//权限ID
	private String right_name;//权限名称
	private String url;//权限URL
	private String resource_path;//权限图片显示资源路径(可选)
	private String parent_id;//父级权限ID
	private 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框架将忽略该属性
	@Transient
	public 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;
	}
	
	@Override
	public 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 stub
		if(this.right_id.equals(obj.getRight_id()))
			return true;
		else
			return 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);
	}

 

  • 大小: 23.8 KB
  • 大小: 33.5 KB
分享到:
评论

相关推荐

    用户权限管理菜单 用户权限管理菜单 用户权限管理菜单

    综上所述,用户权限管理菜单的设计和实现是一个涉及多方面考虑的过程,包括角色定义、权限划分、权限分配、权限控制和审计等。在商业级软件中,这些功能的完善程度直接影响到系统的安全性、稳定性和用户体验。通过...

    通用权限管理设计篇 权限管理设计

    通用权限管理设计是构建复杂应用系统的关键组成部分,其目的是实现灵活、通用且易于管理的权限控制,以适应不同用户和场景的需求。权限管理涉及到多个核心概念,包括权限、用户、角色和组,它们之间有着复杂的关系。...

    Easyui+ashx权限菜单权限管理框架

    "Easyui+ashx权限菜单权限管理框架"是一个结合了前端Easyui框架和后端ashx处理程序的解决方案,用于实现用户权限控制和菜单管理。下面将详细介绍这个框架的关键知识点。 1. Easyui:Easyui是一个基于jQuery的UI库,...

    菜单权限设计

    综上所述,菜单权限设计是一项综合性的任务,涉及到用户界面设计、权限管理策略、后端开发以及用户体验等多个方面。在实际项目中,需要根据业务需求和用户群体进行定制化设计,以达到最佳的使用效果和安全性。

    easyui后台管理系统(菜单权限,按钮权限)

    总结来说,"easyui后台管理系统(菜单权限,按钮权限)"是一个集成了SpringMVC、Hibernate、MySQL和JSP的Web应用,利用EasyUI实现了用户友好的界面和精细的权限控制,适用于构建各类企业级的后台管理系统。...

    delphi 权限菜单 例程

    在Delphi编程环境中,设计一个权限菜单是管理用户访问控制的关键步骤。这涉及到根据用户的权限级别来决定他们能看到哪些功能或菜单项。本例程专为Delphi新手提供,旨在帮助初学者理解如何实现这样的系统。 首先,...

    JAVA用户、角色、权限、菜单、工作流管理系统

    目前系统已经基本集成的功能包含有,用户管理,角色管理,菜单管理,组织管理,数据字典,日志管理,接口管理(暂时未完成实际应用),流程配置,运行流程管理,消息管理(暂无实际应用),业务模块没有做。后台是基于...

    一个基于SpringBoot 2 的管理后台系统,包含了用户管理,组织机构管理,角色管理,功能点管理,菜单管理,权限分配,数据权

    一个基于SpringBoot 2 的管理后台系统,包含了用户管理,组织机构管理,角色管理,功能点管理,菜单管理,权限分配,数据权限分配,代码生成等功能。前端采用了Layui2。数据库以MySQL为实例,理论上是跨数据库平台.

    C#动态添加菜单实现权限管理

    在IT行业中,权限管理和动态添加菜单是Web应用和桌面应用设计中的重要环节,尤其是在多用户环境中,确保每个用户只能访问其被授权的功能至关重要。本文将深入探讨如何利用C#语言来实现这一目标。 首先,权限管理是...

    ssh做的简单菜单权限管理

    在本项目中,EasyUI用于创建用户界面,与SSH框架后端配合,实现菜单权限的展示和交互。 【菜单权限管理】 菜单权限管理是系统安全的重要组成部分,主要涉及用户角色分配、菜单访问控制以及权限分配。在SSH框架中,...

    ThinkPHP(RBAC)权限管理系统_第29讲_角色导航菜单加载

    在本节课程“ThinkPHP(RBAC)权限管理系统_第29讲_角色导航菜单加载”中,我们将深入探讨如何在ThinkPHP框架下实现基于RBAC(Role-Based Access Control,角色基础访问控制)的权限管理系统,并特别关注角色与导航...

    权限管理设计

    在设计B/S业务系统中的权限管理系统时,首要目标是确保只有经过授权的用户才能访问特定的功能,防止非法用户的侵入。权限管理对于B/S系统至关重要,因为与C/S系统相比,浏览器作为通用客户端无法像定制客户端那样...

    详细的权限管理系统设计

    在设计权限管理系统时,我们还需要考虑到系统运行时左侧菜单中的权限分栏。因此,我们需要一张表来控制系统运行时左侧菜单中的权限分栏,即权限分栏表。 权限管理系统的设计需要考虑到多个方面的需求,包括不同职责...

    C#遍历菜单并设置权限

    本文将详细介绍如何利用C#实现菜单权限控制,包括数据库设计、数据操作以及具体的编程实现。 #### 一、数据库设计与数据操作 **1. 创建数据表** 为了存储菜单权限信息,首先需要创建一个数据表`t_...

    权限管理系统设计说明书

    本文将详细阐述权限管理系统的设计,包括核心概念、数据模型和功能模块。 首先,权限管理是系统安全的基础,它确保了只有拥有特定权限的用户才能执行特定的操作。在本系统中,权限表(right)用于存储所有权限的...

    菜单权限管理系统

    综上所述,“菜单权限管理系统”是一个涉及多方面技术的综合项目,涵盖从前端用户界面到后端数据库设计,再到安全性保障等多个层面的知识。对于开发者来说,理解和掌握这些知识点是构建这样系统的基础。

    菜单按钮权限管理系统

    我权限项目分为上左右三部分,5张表:用户表,角色表,资源表(分为权限树,还有页面的按钮资源),用户角色中间表,角色资源中间表。通过登陆用户id联查可以得到相应的权限,展现给用户!并将该用户的资源权限保存...

    C# WinForm实现基于角色权限的菜单

    6. **数据库设计**:在数据库层面,可能需要创建一个`RolePermissions`表,存储角色ID和对应权限的映射关系。同时,`UserRoles`表将记录用户和他们所属的角色。 7. **代码分离**:为了保持良好的代码结构,可以将...

    .net权限管理系统(含数据库,菜单动态添加)

    本篇文章将深入探讨一个基于.NET框架实现的权限管理系统,特别关注其数据库设计、菜单动态添加功能以及北大青鸟的技术实践。 首先,我们来了解一下.NET框架。.NET是由微软公司开发的开源平台,用于构建高性能、跨...

    系统权限管理设计方案.pdf

    系统权限管理设计方案 系统权限管理设计方案是指OA系统中对权限的管理和设计。该设计方案的主要目的是为了简化权限的分配和管理,提高系统的安全性和灵活性。 在该设计方案中,权限是通过模块+动作来产生的,模块...

Global site tag (gtag.js) - Google Analytics