博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java web简单权限管理设计
阅读量:6441 次
发布时间:2019-06-23

本文共 7085 字,大约阅读时间需要 23 分钟。

hot3.png

最近在做一个网站类型项目,主要负责后台,ui框架选型为jquery easy ui,项目架构为spring mvc + spring jdbc,简单易用好上手!搭建好框架后开始了第一个任务,设计并实现一套简单的权限管理功能。

一套最基本的权限管理包括用户、角色、资源。

数据库设计

我的设计如下:

用户:user

角色:role

用户-角色:user_role

资源:resource(包括上级菜单、子菜单、按钮等资源)

角色-资源:role_resource

标准的权限管理系统设计为以上5张表。

注:用户、用户-角色我就不做说明了,这两个是很简单的两块,用户的crud,以及为用户分配角色(多对多的关系)稍微琢磨一下就清楚了,下面都是针对为角色分配权限的实现

后台实现

展示层采用ztree树

role.jsp

<%@ page contentType="text/html;charset=UTF-8"%><%@ include file="/views/back/include/taglib.jsp"%>
角色名称 描述 创建时间
用户名:
创建日期:
至:
查询

action层
RoleAction.java

@RequestMapping(value = "/treedata.jhtml")	@ResponseBody	public String treedata(HttpServletRequest request, Model model) {		DynamicParams params = new DynamicParams(request);		List
> mapList = Lists.newArrayList(); params.put("allMenu", "allMenu"); List
list = authManager.findMenuList(params); List
roleMenus = authManager.findRoleMenuList(params); for (int i = 0; i < list.size(); i++) { Menu e = list.get(i); Map
map = Maps.newHashMap(); map.put("id", e.getId()); map.put("pId", e.getParentId() != null ? e.getParentId() : 0); map.put("name", e.getName()); for (RoleMenu roleMenu : roleMenus) { if (roleMenu.getMenuId() == e.getId()) { map.put("checked", true); } } mapList.add(map); } return toJson(mapList); }

service层

AuthManager.java

// 菜单管理	public List
findMenuList(DynamicParams params) { List
menus = new ArrayList
(); if ("allMenu".equals(params.getString("allMenu"))) { menus = menuDao.findList(params); } else { // 通过用户查询角色 List
userRoles = userRoleDao.findList(params); // 通过角色查询菜单 List
roleMenus = new ArrayList
(); if (userRoles != null && userRoles.size() > 0) { for (UserRole userRole : userRoles) { params = new DynamicParams(); if (userRole != null) { if (userRole.getRoleId().equals(params.getString("rid"))) { break; } params.put("roleId", userRole.getRoleId().toString()); List
rms = roleMenuDao.findList(params); for (RoleMenu roleMenu : rms) { roleMenus.add(roleMenu); } } } } // 查询菜单信息 for (RoleMenu roleMenu : roleMenus) { if (roleMenu != null) { Menu menu = menuDao.find(roleMenu.getMenuId()); if (menu != null) { menus.add(menu); } } } menus = removeDuplicate(menus); Collections.sort(menus); } return menus; }
/**	 * 去除菜单中重复项	 * 	 * @param list	 * @return	 */	private List
removeDuplicate(List
list) { List
result = new ArrayList
(); Set
menuIds = new HashSet
(); for (int i = 0; i < list.size(); i++) { Menu m = list.get(i); if (m != null && menuIds.add(m.getId())) { result.add(m); } } return result; }
public List
findRoleMenuList(DynamicParams params) { List
roleMenus = roleMenuDao.findList(params); return roleMenus; }

Dao层

menuDao

@Override	protected void createQuery(DynamicParams params, StringBuffer sql, List args) {		sql.append("select s.* from sys_menu s where 1=1 ");		String parentId = params.getString("parentId");		if (StringUtils.isNotBlank(parentId)) {			sql.append(" and parent_id = ? ");			args.add(parentId);		}		String sort = params.getString("sort");		String order = params.getString("order");		if (StringUtils.isNotBlank(sort)) {			sql.append(" order by ").append(hump2underline(sort));			if (StringUtils.isNotBlank(order)) {				sql.append(" " + order);			} else {				sql.append(" desc ");			}		} else {			sql.append("order by sort asc,id desc ");		}	}
userRoleDao
@Override	protected void createQuery(DynamicParams params, StringBuffer sql, List args) {		sql.append("select s.* from sys_user_role s where 1=1 ");		Long adminId = params.getLong("adminId");		if (adminId != null) {			sql.append(" and s.user_id = ?");			args.add(adminId);		}	}
roleMenuDao

@Override	protected void createQuery(DynamicParams params, StringBuffer sql, List args) {		sql.append("select s.* from ").append("sys_role_menu").append(" s where 1=1 ");		Long adminId = params.getLong("roleId");		if (adminId != null) {			sql.append(" and s.role_id = ?");			args.add(adminId);		}	}

在WEB-INF目录下建立文件夹tlds 建立自定义标签文件shiros.tld,我们通过自定义标签实现页面按钮的控制。

p2p permission taglib
permission taglib
1.0
p2p_back
http://vanfon.p2p.cn/
权限校验标签,有权限就显示标签体的内容,否则不显示
permission
com.vanfon.p2p.back.tag.PermissionTag
JSP
module
true
false
code
true
false

自定义标签类

package com.vanfon.p2p.back.tag;import java.util.List;import javax.servlet.http.HttpServletRequest;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.TagSupport;import com.vanfon.p2p.entity.system.Admin;import com.vanfon.p2p.entity.system.Menu;import com.vanfon.p2p.manager.system.AuthManager;import com.vanfon.p2p.utils.DynamicParams;import com.vanfon.p2p.utils.SpringContextHolder;/** * 权限控制标签 *  * @author zhangwx * @date 2015-2-5 */public class PermissionTag extends TagSupport {	/**	 * 	 */	private static final long serialVersionUID = 4592227792811389132L;	private String module;// 属性名必须与JSP自定义标签的属性名一样	private String code;	public String getModule() {		return module;	}	public void setModule(String module) {		this.module = module;	}	public String getCode() {		return code;	}	public void setCode(String code) {		this.code = code;	}	@Override	public int doStartTag() throws JspException {		boolean result = false;		HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();// 通过成员变量获取HttpServletRequest对象		Admin admin = (Admin) request.getSession().getAttribute("admin");// 获取登录到系统的用户		if (admin != null) {			if ("1".equals(String.valueOf(admin.getIfsuper()))) {// 超级管理员				result = true;			} else {				DynamicParams params = new DynamicParams();				params.put("id", String.valueOf(admin.getId()));				params.put("module", this.module);				params.put("code", this.code);				AuthManager authManager = SpringContextHolder.getBean(AuthManager.class);				List
userRoleAuths = authManager.findUserRoleAuthList(params); if (userRoleAuths != null && userRoleAuths.size() > 0) { result = true; } } } return result ? EVAL_BODY_INCLUDE : SKIP_BODY; }}

以上就是该权限管理中权限树(为角色分配权限)的大体实现。

转载于:https://my.oschina.net/abbchina/blog/719496

你可能感兴趣的文章
spark 应用程序性能优化经验
查看>>
基于Zabbix IPMI监控服务器硬件状况
查看>>
Go语言之并发资源竞争
查看>>
mac本显示隐藏文件或关闭显示隐藏文件
查看>>
spring4.0 整合 Quartz 实现任务调度(一)
查看>>
android复杂布局的一点思路
查看>>
Awesome Python
查看>>
java web简单权限管理设计
查看>>
Google Analytics
查看>>
【转】什么是云计算
查看>>
MySQL 5.7及以上解压缩版本配置安装
查看>>
Extjs4.0 Chart属性中文解释
查看>>
PHP单例模式的实现
查看>>
httpClient post 数据传输和处理
查看>>
newLISP你也行 --- 字符串
查看>>
【译】Swift 2.0 下面向协议的MVVM架构实践
查看>>
html5拖拽
查看>>
Android工具HierarchyViewer 代码导读(2) -- 建立Eclipse调试环境
查看>>
GC配置对性能的帮助
查看>>
java list按时间倒序、首字母排序
查看>>