最近在做一个网站类型项目,主要负责后台,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
service层
AuthManager.java
// 菜单管理 public List
/** * 去除菜单中重复项 * * @param list * @return */ private ListremoveDuplicate(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 ListDao层findRoleMenuList(DynamicParams params) { List roleMenus = roleMenuDao.findList(params); return roleMenus; }
menuDao
@Override protected void createQuery(DynamicParams params, StringBuffer sql, ListuserRoleDao
@Override protected void createQuery(DynamicParams params, StringBuffer sql, ListroleMenuDao
@Override protected void createQuery(DynamicParams params, StringBuffer sql, List
在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); ListuserRoleAuths = authManager.findUserRoleAuthList(params); if (userRoleAuths != null && userRoleAuths.size() > 0) { result = true; } } } return result ? EVAL_BODY_INCLUDE : SKIP_BODY; }}
以上就是该权限管理中权限树(为角色分配权限)的大体实现。