java web实现用户权限管理

 更新时间:2015年11月23日 11:35:47   作者:Garry1115  
这篇文章主要介绍了java web实现用户权限管理,设计并实现一套简单的权限管理功能,感兴趣的小伙伴们可以参考一下

最近在做一个网站类型项目,主要负责后台,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"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta name="decorator" content="back" /> 
<script type="text/javaScript"> 
//打开菜单窗口 
function openMenuDialog(){ 
 var selected = $("#list").datagrid('getSelected'); 
 if (selected != null) { 
  $("#id").val(selected.id); 
  queryMenus(selected.id); 
  $("#menuWindow").window("open"); 
 } else { 
  $.messager.alert('提示', "未选择数据!"); 
 } 
} 
//角色-菜单信息入库 
function ajaxSubmit(rid,idstr){ 
 $.post("${ctx}/roleMenu/save.jhtml",{"roleId":rid,"ids":idstr},function(obj){ 
  $.messager.alert('提示',obj.msg); 
  $("#menuWindow").window('close'); 
 },'json'); 
} 
</script> 
<!-- ztree --> 
<script type="text/javascript"> 
var tree = ""; 
var setting = { 
 check : { 
  chkboxType:{"Y":"ps","N":"s"},//勾选checkbox对于父子节点的关联关系,取消勾选时不关联父 
  chkStyle:"checkbox", 
  enable : true //是否复选框 
 }, 
 //数据 
 data : { 
  simpleData : { 
   enable : true 
  } 
 } 
}; 
//查询菜单信息 
function queryMenus(roleId){ 
 $.post('${ctx}/role/treedata.jhtml', {'roleId':roleId}, function(zNodes) { 
  for (var i = 0; i < zNodes.length; i++) { 
   if (zNodes[i].isParent) { 
 
   } else { 
    //zNodes[i].icon = "${ctxStatic}/images/532.ico";//设置图标 
   } 
  } 
  tree = $.fn.zTree.init($("#tree"), setting, zNodes); 
  tree.expandAll(true);//全部展开 
  //var nodes = treeObj.getNodes(); 
 }, 'json'); 
} 
 
//获取选中节点 
function onCheck(){ 
  var rid = $("#id").val(); 
  var treeObj=$.fn.zTree.getZTreeObj("tree"); 
  var nodes=treeObj.getCheckedNodes(true); 
  var ids = new Array(); 
  for(var i=0;i<nodes.length;i++){ 
  //获取选中节点的值 
   ids.push(nodes[i].id); 
  // v+=nodes[i].id + ","; 
  //alert(nodes[i].id); 
  } 
 ajaxSubmit(rid,ids);  
} 
</script> 
</head> 
<body> 
 <!-- 数据表格 --> 
 <table id="list" url='${ctx}/role/list/page.jhtml' method='post' 
  class="easyui-datagrid" style="width:100%;" fitcolumns="true" 
  toolbar='#tb' pagination='true' rownumbers='true' singleSelect='true'> 
  <thead> 
   <tr> 
    <th field='name' sortable='true' width='100'>角色名称</th> 
    <th field='description' width='200' align='right'>描述</th> 
    <th field='createTimeFormat' width='150' align='center'>创建时间</th>     
   </tr> 
  </thead> 
 </table> 
  
 <!-- 编辑栏 --> 
 <div id="tb" style="padding:5px 5px;"> 
  <div> 
   <p2p:permission module="role" code="add"><a href="#" class="easyui-linkbutton" iconCls="icon-add" onclick="openCreateDialog();">新增</a></p2p:permission> 
   <p2p:permission module="role" code="edit"><a href="#" class="easyui-linkbutton" iconCls="icon-edit" onclick="openUpdateDialog();">编辑</a></p2p:permission> 
   <p2p:permission module="role" code="delete"><a href="#" class="easyui-linkbutton" iconCls="icon-remove" onclick="del();">删除</a></p2p:permission> 
   <p2p:permission module="role" code="authority"><a href="#" class="easyui-linkbutton" iconCls="icon-edit" onclick="openMenuDialog();">设置权限</a></p2p:permission> 
  </div> 
  <!-- 搜索项 --> 
  <div style="margin-top:5px;padding-left:5px"> 
   用户名: <input id="query_name" class="easyui-textbox" type="text" style="width:110px" /> 
   创建日期: <input id="query_startDate" class="easyui-datebox" style="width:110px"> 
   至:  <input id="query_endDate" class="easyui-datebox" style="width:110px"> 
   <a onclick="reload();" href="#" class="easyui-linkbutton" iconCls="icon-search">查询</a> 
  </div> 
 </div> 
  
  
  
 <!-- 权限窗口 --> 
 <div id="menuWindow" class="easyui-window" title="配置权限" data-options="modal:true,iconCls:'icon-save',footer:'#menuWindowfooter'" style="width:350px;height:420px;padding:10px"> 
  <div id="tree" class="ztree" style="padding: 10px 20px;"></div> 
 </div> 
 <div id="menuWindowfooter" style="padding:5px;text-align:right;"> 
  <a href="#" onclick="onCheck();" class="easyui-linkbutton" data-options="iconCls:'icon-save'">提交</a> 
 </div> 
  
</body> 
</html> 


action层
RoleAction.java

@RequestMapping(value = "/treedata.jhtml") 
 @ResponseBody 
 public String treedata(HttpServletRequest request, Model model) { 
  DynamicParams params = new DynamicParams(request); 
  List<Map<String, Object>> mapList = Lists.newArrayList(); 
 
  params.put("allMenu", "allMenu"); 
  List<Menu> list = authManager.findMenuList(params); 
 
  List<RoleMenu> roleMenus = authManager.findRoleMenuList(params); 
 
  for (int i = 0; i < list.size(); i++) { 
   Menu e = list.get(i); 
   Map<String, Object> 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<Menu> findMenuList(DynamicParams params) { 
  List<Menu> menus = new ArrayList<Menu>(); 
 
  if ("allMenu".equals(params.getString("allMenu"))) { 
   menus = menuDao.findList(params); 
  } else { 
   // 通过用户查询角色 
   List<UserRole> userRoles = userRoleDao.findList(params); 
   // 通过角色查询菜单 
   List<RoleMenu> roleMenus = new ArrayList<RoleMenu>(); 
   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<RoleMenu> 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<Menu> removeDuplicate(List<Menu> list) { 
  List<Menu> result = new ArrayList<Menu>(); 
  Set<Long> menuIds = new HashSet<Long>(); 
  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<RoleMenu> findRoleMenuList(DynamicParams params) { 
  List<RoleMenu> roleMenus = roleMenuDao.findList(params); 
  return roleMenus; 
 } 

Dao层
menuDao

@Override 
 protected void createQuery(DynamicParams params, StringBuffer sql, List<Object> 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<Object> 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<Object> 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,我们通过自定义标签实现页面按钮的控制。

<span style="color:#333333;"><?xml version="1.0" encoding="UTF-8" ?> 
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" 
 version="2.0"> 
 <description>p2p permission taglib</description> 
 <display-name>permission taglib</display-name> 
 <tlib-version>1.0</tlib-version> 
 <short-name>p2p_back</short-name> 
 <uri>http://vanfon.p2p.cn/</uri> 
 
 <tag> 
  <description>权限校验标签,有权限就显示标签体的内容,否则不显示</description> 
  <name>permission</name> 
  <tag-class>com.vanfon.p2p.back.tag.PermissionTag</tag-class> 
  <body-content>JSP</body-content> 
  <attribute> 
   <description></description> 
   <name>module</name> 
   <required>true</required> 
   <rtexprvalue>false</rtexprvalue> 
  </attribute> 
  <attribute> 
   <description></description> 
   <name>code</name> 
   <required>true</required> 
   <rtexprvalue>false</rtexprvalue> 
  </attribute> 
 </tag> 
</taglib></span> 

自定义标签类

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<Menu> userRoleAuths = authManager.findUserRoleAuthList(params); 
    if (userRoleAuths != null && userRoleAuths.size() > 0) { 
     result = true; 
    } 
   } 
  } 
  return result ? EVAL_BODY_INCLUDE : SKIP_BODY; 
 } 
} 

 

以上就是该权限管理中权限树的大体实现,完成了java web实现用户权限管理的功能,希望对大家的学习有所帮助。

相关文章

  • SpringBoot与Quartz集成实现分布式定时任务集群的代码实例

    SpringBoot与Quartz集成实现分布式定时任务集群的代码实例

    今天小编就为大家分享一篇关于SpringBoot与Quartz集成实现分布式定时任务集群的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 浅析Java getResource详细介绍

    浅析Java getResource详细介绍

    这篇文章主要介绍了Java getResource 讲解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Java常用锁synchronized和ReentrantLock的区别

    Java常用锁synchronized和ReentrantLock的区别

    这篇文章主要介绍了Java常用锁synchronized和ReentrantLock的区别,二者的功效都是相同的,但又有很多不同点,下面我们就进入文章了解具体的相关内容吧。需要的小伙伴也可以参考一下
    2022-05-05
  • java数组排序示例(冒泡排序、快速排序、希尔排序、选择排序)

    java数组排序示例(冒泡排序、快速排序、希尔排序、选择排序)

    java中在运用数组进行排序功能时,一般有四种方法:快速排序法、冒泡法、选择排序法、插入排序法(希尔排序(Shell Sort)是插入排序的一种),下面是一些示例,需要的朋友可以参考下
    2014-03-03
  • Java的关键字之transient详解

    Java的关键字之transient详解

    这篇文章主要介绍了Java的关键字之transient详解,在Java编程中,transient是一个关键字,通常用于修饰变量,它的主要作用是用于指示JVM在对象序列化时忽略指定变量,从而避免数据泄露的安全问题,需要的朋友可以参考下
    2023-09-09
  • 详解SpringBoot如何优雅的进行全局异常处理

    详解SpringBoot如何优雅的进行全局异常处理

    在SpringBoot的开发中,为了提高程序运行的鲁棒性,我们经常需要对各种程序异常进行处理,但是如果在每个出异常的地方进行单独处理的话,这会引入大量业务不相关的异常处理代码,这篇文章带大家了解一下如何优雅的进行全局异常处理
    2023-07-07
  • Java计算交集,差集,并集的方法示例

    Java计算交集,差集,并集的方法示例

    这篇文章主要介绍了Java计算交集,差集,并集的方法,结合实例形式简单分析了java集合运算的简单操作技巧,需要的朋友可以参考下
    2017-10-10
  • Mybatis如何通过注解开启使用二级缓存

    Mybatis如何通过注解开启使用二级缓存

    这篇文章主要介绍了Mybatis基于注解开启使用二级缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • java 定义长度为0的数组/空数组案例

    java 定义长度为0的数组/空数组案例

    这篇文章主要介绍了java 定义长度为0的数组/空数组案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • SpringBoot整合SpringSecurity实现权限控制之实现多标签页

    SpringBoot整合SpringSecurity实现权限控制之实现多标签页

    这篇文章主要介绍了SpringBoot整合SpringSecurity实现权限控制之实现多标签页,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11

最新评论