原文地址:http://blog.csdn.net/zwx19921215/article/details/44467099

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

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

数据库设计

我的设计如下:

用户:user

角色:role

用户-角色:user_role

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

角色-资源:role_resource

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

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

后台实现

展示层采用ztree树

role.jsp

  1. <%@ page contentType="text/html;charset=UTF-8"%>
  2. <%@ include file="/views/back/include/taglib.jsp"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml">
  5. <head>
  6. <meta name="decorator" content="back" />
  7. <script type="text/javaScript">
  8. //打开菜单窗口
  9. function openMenuDialog(){
  10. var selected = $("#list").datagrid('getSelected');
  11. if (selected != null) {
  12. $("#id").val(selected.id);
  13. queryMenus(selected.id);
  14. $("#menuWindow").window("open");
  15. } else {
  16. $.messager.alert('提示', "未选择数据!");
  17. }
  18. }
  19. //角色-菜单信息入库
  20. function ajaxSubmit(rid,idstr){
  21. $.post("${ctx}/roleMenu/save.jhtml",{"roleId":rid,"ids":idstr},function(obj){
  22. $.messager.alert('提示',obj.msg);
  23. $("#menuWindow").window('close');
  24. },'json');
  25. }
  26. </script>
  27. <!-- ztree -->
  28. <script type="text/javascript">
  29. var tree = "";
  30. var setting = {
  31. check : {
  32. chkboxType:{"Y":"ps","N":"s"},//勾选checkbox对于父子节点的关联关系,取消勾选时不关联父
  33. chkStyle:"checkbox",
  34. enable : true   //是否复选框
  35. },
  36. //数据
  37. data : {
  38. simpleData : {
  39. enable : true
  40. }
  41. }
  42. };
  43. //查询菜单信息
  44. function queryMenus(roleId){
  45. $.post('${ctx}/role/treedata.jhtml', {'roleId':roleId}, function(zNodes) {
  46. for (var i = 0; i < zNodes.length; i++) {
  47. if (zNodes[i].isParent) {
  48. } else {
  49. //zNodes[i].icon = "${ctxStatic}/images/532.ico";//设置图标
  50. }
  51. }
  52. tree = $.fn.zTree.init($("#tree"), setting, zNodes);
  53. tree.expandAll(true);//全部展开
  54. //var nodes = treeObj.getNodes();
  55. }, 'json');
  56. }
  57. //获取选中节点
  58. function onCheck(){
  59. var rid = $("#id").val();
  60. var treeObj=$.fn.zTree.getZTreeObj("tree");
  61. var nodes=treeObj.getCheckedNodes(true);
  62. var ids = new Array();
  63. for(var i=0;i<nodes.length;i++){
  64. //获取选中节点的值
  65. ids.push(nodes[i].id);
  66. // v+=nodes[i].id + ",";
  67. //alert(nodes[i].id);
  68. }
  69. ajaxSubmit(rid,ids);
  70. }
  71. </script>
  72. </head>
  73. <body>
  74. <!-- 数据表格 -->
  75. <table id="list" url='${ctx}/role/list/page.jhtml' method='post'
  76. class="easyui-datagrid" style="width:100%;" fitcolumns="true"
  77. toolbar='#tb' pagination='true' rownumbers='true' singleSelect='true'>
  78. <thead>
  79. <tr>
  80. <th field='name' sortable='true' width='100'>角色名称</th>
  81. <th field='description' width='200' align='right'>描述</th>
  82. <th field='createTimeFormat' width='150' align='center'>创建时间</th>
  83. </tr>
  84. </thead>
  85. </table>
  86. <!-- 编辑栏  -->
  87. <div id="tb" style="padding:5px 5px;">
  88. <div>
  89. <p2p:permission module="role" code="add"><a href="#" class="easyui-linkbutton" iconCls="icon-add" onclick="openCreateDialog();">新增</a></p2p:permission>
  90. <p2p:permission module="role" code="edit"><a href="#" class="easyui-linkbutton" iconCls="icon-edit" onclick="openUpdateDialog();">编辑</a></p2p:permission>
  91. <p2p:permission module="role" code="delete"><a href="#" class="easyui-linkbutton" iconCls="icon-remove" onclick="del();">删除</a></p2p:permission>
  92. <p2p:permission module="role" code="authority"><a href="#" class="easyui-linkbutton" iconCls="icon-edit" onclick="openMenuDialog();">设置权限</a></p2p:permission>
  93. </div>
  94. <!-- 搜索项 -->
  95. <div style="margin-top:5px;padding-left:5px">
  96. 用户名:   <input id="query_name" class="easyui-textbox" type="text" style="width:110px" />
  97. 创建日期: <input id="query_startDate" class="easyui-datebox" style="width:110px">
  98. 至:     <input id="query_endDate" class="easyui-datebox" style="width:110px">
  99. <a onclick="reload();" href="#" class="easyui-linkbutton" iconCls="icon-search">查询</a>
  100. </div>
  101. </div>
  102. <!-- 权限窗口 -->
  103. <div id="menuWindow" class="easyui-window" title="配置权限" data-options="modal:true,iconCls:'icon-save',footer:'#menuWindowfooter'" style="width:350px;height:420px;padding:10px">
  104. <div id="tree" class="ztree" style="padding: 10px 20px;"></div>
  105. </div>
  106. <div id="menuWindowfooter" style="padding:5px;text-align:right;">
  107. <a href="#" onclick="onCheck();" class="easyui-linkbutton" data-options="iconCls:'icon-save'">提交</a>
  108. </div>
  109. </body>
  110. </html>


action层
RoleAction.java

  1. @RequestMapping(value = "/treedata.jhtml")
  2. @ResponseBody
  3. public String treedata(HttpServletRequest request, Model model) {
  4. DynamicParams params = new DynamicParams(request);
  5. List<Map<String, Object>> mapList = Lists.newArrayList();
  6. params.put("allMenu", "allMenu");
  7. List<Menu> list = authManager.findMenuList(params);
  8. List<RoleMenu> roleMenus = authManager.findRoleMenuList(params);
  9. for (int i = 0; i < list.size(); i++) {
  10. Menu e = list.get(i);
  11. Map<String, Object> map = Maps.newHashMap();
  12. map.put("id", e.getId());
  13. map.put("pId", e.getParentId() != null ? e.getParentId() : 0);
  14. map.put("name", e.getName());
  15. for (RoleMenu roleMenu : roleMenus) {
  16. if (roleMenu.getMenuId() == e.getId()) {
  17. map.put("checked", true);
  18. }
  19. }
  20. mapList.add(map);
  21. }
  22. return toJson(mapList);
  23. }

service层

AuthManager.java

  1. // 菜单管理
  2. public List<Menu> findMenuList(DynamicParams params) {
  3. List<Menu> menus = new ArrayList<Menu>();
  4. if ("allMenu".equals(params.getString("allMenu"))) {
  5. menus = menuDao.findList(params);
  6. } else {
  7. // 通过用户查询角色
  8. List<UserRole> userRoles = userRoleDao.findList(params);
  9. // 通过角色查询菜单
  10. List<RoleMenu> roleMenus = new ArrayList<RoleMenu>();
  11. if (userRoles != null && userRoles.size() > 0) {
  12. for (UserRole userRole : userRoles) {
  13. params = new DynamicParams();
  14. if (userRole != null) {
  15. if (userRole.getRoleId().equals(params.getString("rid"))) {
  16. break;
  17. }
  18. params.put("roleId", userRole.getRoleId().toString());
  19. List<RoleMenu> rms = roleMenuDao.findList(params);
  20. for (RoleMenu roleMenu : rms) {
  21. roleMenus.add(roleMenu);
  22. }
  23. }
  24. }
  25. }
  26. // 查询菜单信息
  27. for (RoleMenu roleMenu : roleMenus) {
  28. if (roleMenu != null) {
  29. Menu menu = menuDao.find(roleMenu.getMenuId());
  30. if (menu != null) {
  31. menus.add(menu);
  32. }
  33. }
  34. }
  35. menus = removeDuplicate(menus);
  36. Collections.sort(menus);
  37. }
  38. return menus;
  39. }
  1. /**
  2. * 去除菜单中重复项
  3. *
  4. * @param list
  5. * @return
  6. */
  7. private List<Menu> removeDuplicate(List<Menu> list) {
  8. List<Menu> result = new ArrayList<Menu>();
  9. Set<Long> menuIds = new HashSet<Long>();
  10. for (int i = 0; i < list.size(); i++) {
  11. Menu m = list.get(i);
  12. if (m != null && menuIds.add(m.getId())) {
  13. result.add(m);
  14. }
  15. }
  16. return result;
  17. }
  1. public List<RoleMenu> findRoleMenuList(DynamicParams params) {
  2. List<RoleMenu> roleMenus = roleMenuDao.findList(params);
  3. return roleMenus;
  4. }

Dao层

menuDao

  1. @Override
  2. protected void createQuery(DynamicParams params, StringBuffer sql, List<Object> args) {
  3. sql.append("select s.* from sys_menu s where 1=1 ");
  4. String parentId = params.getString("parentId");
  5. if (StringUtils.isNotBlank(parentId)) {
  6. sql.append(" and parent_id = ? ");
  7. args.add(parentId);
  8. }
  9. String sort = params.getString("sort");
  10. String order = params.getString("order");
  11. if (StringUtils.isNotBlank(sort)) {
  12. sql.append(" order by ").append(hump2underline(sort));
  13. if (StringUtils.isNotBlank(order)) {
  14. sql.append(" " + order);
  15. } else {
  16. sql.append(" desc ");
  17. }
  18. } else {
  19. sql.append("order by sort asc,id desc ");
  20. }
  21. }

userRoleDao

  1. @Override
  2. protected void createQuery(DynamicParams params, StringBuffer sql, List<Object> args) {
  3. sql.append("select s.* from sys_user_role s where 1=1 ");
  4. Long adminId = params.getLong("adminId");
  5. if (adminId != null) {
  6. sql.append(" and s.user_id = ?");
  7. args.add(adminId);
  8. }
  9. }

roleMenuDao

  1. @Override
  2. protected void createQuery(DynamicParams params, StringBuffer sql, List<Object> args) {
  3. sql.append("select s.* from ").append("sys_role_menu").append(" s where 1=1 ");
  4. Long adminId = params.getLong("roleId");
  5. if (adminId != null) {
  6. sql.append(" and s.role_id = ?");
  7. args.add(adminId);
  8. }
  9. }

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


  1. <span style="color:#333333;"><?xml version="1.0" encoding="UTF-8" ?>
  2. <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
  4. version="2.0">
  5. <description>p2p permission taglib</description>
  6. <display-name>permission taglib</display-name>
  7. <tlib-version>1.0</tlib-version>
  8. <short-name>p2p_back</short-name>
  9. <uri>http://vanfon.p2p.cn/</uri>
  10. <tag>
  11. <description>权限校验标签,有权限就显示标签体的内容,否则不显示</description>
  12. <name>permission</name>
  13. <tag-class>com.vanfon.p2p.back.tag.PermissionTag</tag-class>
  14. <body-content>JSP</body-content>
  15. <attribute>
  16. <description></description>
  17. <name>module</name>
  18. <required>true</required>
  19. <rtexprvalue>false</rtexprvalue>
  20. </attribute>
  21. <attribute>
  22. <description></description>
  23. <name>code</name>
  24. <required>true</required>
  25. <rtexprvalue>false</rtexprvalue>
  26. </attribute>
  27. </tag>
  28. </taglib></span>


自定义标签类

  1. package com.vanfon.p2p.back.tag;
  2. import java.util.List;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.jsp.JspException;
  5. import javax.servlet.jsp.tagext.TagSupport;
  6. import com.vanfon.p2p.entity.system.Admin;
  7. import com.vanfon.p2p.entity.system.Menu;
  8. import com.vanfon.p2p.manager.system.AuthManager;
  9. import com.vanfon.p2p.utils.DynamicParams;
  10. import com.vanfon.p2p.utils.SpringContextHolder;
  11. /**
  12. * 权限控制标签
  13. *
  14. * @author zhangwx
  15. * @date 2015-2-5
  16. */
  17. public class PermissionTag extends TagSupport {
  18. /**
  19. *
  20. */
  21. private static final long serialVersionUID = 4592227792811389132L;
  22. private String module;// 属性名必须与JSP自定义标签的属性名一样
  23. private String code;
  24. public String getModule() {
  25. return module;
  26. }
  27. public void setModule(String module) {
  28. this.module = module;
  29. }
  30. public String getCode() {
  31. return code;
  32. }
  33. public void setCode(String code) {
  34. this.code = code;
  35. }
  36. @Override
  37. public int doStartTag() throws JspException {
  38. boolean result = false;
  39. HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();// 通过成员变量获取HttpServletRequest对象
  40. Admin admin = (Admin) request.getSession().getAttribute("admin");// 获取登录到系统的用户
  41. if (admin != null) {
  42. if ("1".equals(String.valueOf(admin.getIfsuper()))) {// 超级管理员
  43. result = true;
  44. } else {
  45. DynamicParams params = new DynamicParams();
  46. params.put("id", String.valueOf(admin.getId()));
  47. params.put("module", this.module);
  48. params.put("code", this.code);
  49. AuthManager authManager = SpringContextHolder.getBean(AuthManager.class);
  50. List<Menu> userRoleAuths = authManager.findUserRoleAuthList(params);
  51. if (userRoleAuths != null && userRoleAuths.size() > 0) {
  52. result = true;
  53. }
  54. }
  55. }
  56. return result ? EVAL_BODY_INCLUDE : SKIP_BODY;
  57. }
  58. }

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



[转]java web简单权限管理设计的更多相关文章

  1. java web简单权限管理设计

    一套最基本的权限管理包括用户.角色.资源. 数据库设计 我的设计如下: 用户:user 角色:role 用户-角色:user_role 资源:resource(包括上级菜单.子菜单.按钮等资源) 角色 ...

  2. java中通用权限管理设计(转)

    原文地址:http://www.cnblogs.com/a7345678/archive/2008/09/25/1298838.html 转自博客园暗夜精灵-鬼才阁 实现业务系统中的用户权限管理 B/ ...

  3. java web 简单的权限管理

    spring ,springMvc ,mybatis 简单权限管理 其实只需要3张表..admin_group  ,function,group 表

  4. Web端权限管理新增实用功能:批量增加操作,简单方便快速!

    扩展了吉日嘎拉的Web端权限管理功能后,每次添加菜单倒没啥问题,毕竟菜单的数量有限,可是每增加一个模块.功能或者说权限控制点,就得针对各种常规操作,新增很多遍. 浪费时间,还容易出错.新增了一个字典表 ...

  5. 基于Spring Security2与 Ext 的权限管理设计与兑现

    基于Spring Security2与 Ext 的权限管理设计与实现 一.Spring Security介绍 Spring Security的前身Acegi,其配置及使用相对来说复杂一些,因为要配置的 ...

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

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

  7. MyEclipse创建SSH项目(Java web由maven管理)

    JavaEE后台开发,MyEclipse创建SSH项目,MyEclipse创建Java web 由maven管理的SSH项目. Demo工程源码github地址 1.创建SSH项目 1.创建web工程 ...

  8. asp.net mvc的权限管理设计

    现在集中展示用户-角色-权限管理的功能,因此,所有数据表一律简化处理.   1 后台管理效果 (1)角色管理 (2)权限管理   2 数据库设计(MSSQL) (1)用户表dbo.Users 项 类型 ...

  9. 【Java】JavaWeb权限管理

    权限管理分析 每个网站都涉及到访问权限的控制.每个站点资源都需要被管理起来,用户只有具有访问某个资源的特定权限,才能够访问,否则拒绝访问.网站的访问权限控制,一种方法从 URI 入手,站点的每个资源都 ...

随机推荐

  1. iScroll4下表单元素聚焦及键盘的异常问题

    本文是zawa同事写的一篇博文,相信很多在webapp开发中的同学使用iscroll4会遇到的该问题,问过zawa兄的建议,在这里分享给大家,希望能帮助到各位~ 原文地址:http://www.zaw ...

  2. Quantum Bogo sort浅谈

    1.普通的猴子排序(bogo sort) 猴子排序百科 en.wikipedia.org/wiki/Bogosort 不停的随机打乱序列,然后检查,直到排好序 复杂度O(n*n!) while not ...

  3. 第63课 C语言异常处理

    1. 异常的概念 (1)程序在运行过程中可能产生异常 (2)异常(Exception)与Bug的区别 ①异常是程序运行时可预料的执行分支 ②Bug是程序是的错误,是不被预期的运行方式 2. 异常和Bu ...

  4. jmeter jdbc request使用详解

    1.在使用 jdbc request之前需要加载一个jar包 在test plan中将jar包引入到classpath中 2.创建一个JDBC Connection Configuration Var ...

  5. CSS3文本超出容器显示省略号之text-overflow属性

    text-overflow:ellipsis; overflow:hidden; white-space:nowrap; 要想实现文本超出容器时显示省略号,上面3个属性必须同时搭配使用

  6. python的高级特性3:神奇的__call__与返回函数

    __call__是一个很神奇的特性,只要某个类型中有__call__方法,,我们可以把这个类型的对象当作函数来使用. 也许说的比较抽象,举个例子就会明白. In [107]: f = abs In [ ...

  7. 用Javascript判断访问来源操作系统, 设备, 浏览器类型

    var browser = { os : function() { var u = navigator.userAgent; return {// 操作系统 linux: !!u.match(/\(X ...

  8. IntelliJ IDEA 编译maven项目以及运行测试前编译项目

    Maven编译及命令行输出 右侧Maven Projects, 打开, 选取某个Project打开至Lifecycle/package 或其他任何一个lifecycle选项, 在上面右键Run Mav ...

  9. 【BZOJ 1001】[BeiJing2006]狼抓兔子

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...

  10. hadoop 2.6伪分布安装

    hadoop 2.6的“伪”分式安装与“全”分式安装相比,大部分操作是相同的,主要区别在于不用配置slaves文件,而且其它xxx-core.xml里的参数很多也可以省略,下面是几个关键的配置: (安 ...