网站首页> 博客> java web简单权限管理设计

java web简单权限管理设计

好文 2110
ONE源码官方
收藏

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

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


数据库设计

我的设计如下:

用户:user

角色:role

用户-角色:user_role

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

角色-资源:role_resource

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


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


后台实现

展示层采用ztree树

role.jsp

[html] view plain copy

  1. <%@ page contentType="text/html;charset=UTF-8"%>  

  2. <%@ include file="/views/back/include/taglib.jsp"%>  

  3. >  

  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.   

  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.   

  49.             } else {  

  50.                 //zNodes[i].icon = "${ctxStatic}/images/532.ico";//设置图标  

  51.             }  

  52.         }  

  53.         tree = $.fn.zTree.init($("#tree"), setting, zNodes);  

  54.         tree.expandAll(true);//全部展开  

  55.         //var nodes = treeObj.getNodes();  

  56.     }, 'json');  

  57. }  

  58.   

  59. //获取选中节点  

  60. function onCheck(){  

  61.      var rid = $("#id").val();  

  62.      var treeObj=$.fn.zTree.getZTreeObj("tree");  

  63.      var nodes=treeObj.getCheckedNodes(true);  

  64.      var ids = new Array();  

  65.      for(var i=0;i<nodes.length;i++){  

  66.         //获取选中节点的值  

  67.          ids.push(nodes[i].id);  

  68.         // v+=nodes[i].id + ",";  

  69.         //alert(nodes[i].id);   

  70.      }  

  71.     ajaxSubmit(rid,ids);       

  72. }  

  73. script>  

  74. head>  

  75. <body>  

  76.       

  77.     <table id="list" url='${ctx}/role/list/page.jhtml' method='post'  

  78.         class="easyui-datagrid" style="width:100%;" fitcolumns="true"   

  79.         toolbar='#tb' pagination='true' rownumbers='true' singleSelect='true'>  

  80.         <thead>  

  81.             <tr>  

  82.                 <th field='name' sortable='true' width='100'>角色名称th>  

  83.                 <th field='description' width='200' align='right'>描述th>  

  84.                 <th field='createTimeFormat' width='150' align='center'>创建时间th>                 

  85.             tr>  

  86.         thead>  

  87.     table>  

  88.       

  89.       

  90.     <div id="tb" style="padding:5px 5px;">  

  91.         <div>  

  92.             <p2p:permission module="role" code="add"><a href="#" class="easyui-linkbutton" iconCls="icon-add" onclick="openCreateDialog();">新增a>p2p:permission>  

  93.             <p2p:permission module="role" code="edit"><a href="#" class="easyui-linkbutton" iconCls="icon-edit" onclick="openUpdateDialog();">编辑a>p2p:permission>  

  94.             <p2p:permission module="role" code="delete"><a href="#" class="easyui-linkbutton" iconCls="icon-remove" onclick="del();">删除a>p2p:permission>  

  95.             <p2p:permission module="role" code="authority"><a href="#" class="easyui-linkbutton" iconCls="icon-edit" onclick="openMenuDialog();">设置权限a>p2p:permission>  

  96.         div>  

  97.           

  98.         <div style="margin-top:5px;padding-left:5px">  

  99.             用户名:   <input id="query_name" class="easyui-textbox" type="text" style="width:110px" />  

  100.             创建日期: <input id="query_startDate" class="easyui-datebox" style="width:110px">  

  101.             至:     <input id="query_endDate" class="easyui-datebox" style="width:110px">  

  102.             <a onclick="reload();" href="#" class="easyui-linkbutton" iconCls="icon-search">查询a>  

  103.         div>  

  104.     div>  

  105.       

  106.       

  107.       

  108.       

  109.     <div id="menuWindow" class="easyui-window" title="配置权限" data-options="modal:true,iconCls:'icon-save',footer:'#menuWindowfooter'" style="width:350px;height:420px;padding:10px">  

  110.         <div id="tree" class="ztree" style="padding: 10px 20px;">div>  

  111.     div>  

  112.     <div id="menuWindowfooter" style="padding:5px;text-align:right;">   

  113.         <a href="#" onclick="onCheck();" class="easyui-linkbutton" data-options="iconCls:'icon-save'">提交a>  

  114.     div>  

  115.       

  116. body>  

  117. html>  



action层
RoleAction.java


[java] view plain copy

  1. @RequestMapping(value = "/treedata.jhtml")  

  2.     @ResponseBody  

  3.     public String treedata(HttpServletRequest request, Model model) {  

  4.         DynamicParams params = new DynamicParams(request);  

  5.         List> mapList = Lists.newArrayList();  

  6.   

  7.         params.put("allMenu""allMenu");  

  8.         List

     list = authManager.findMenuList(params);  

  9.   

  10.         List roleMenus = authManager.findRoleMenuList(params);  

  11.   

  12.         for (int i = 0; i < list.size(); i++) {  

  13.             Menu e = list.get(i);  

  14.             Map map = Maps.newHashMap();  

  15.             map.put("id", e.getId());  

  16.             map.put("pId", e.getParentId() != null ? e.getParentId() : 0);  

  17.             map.put("name", e.getName());  

  18.             for (RoleMenu roleMenu : roleMenus) {  

  19.                 if (roleMenu.getMenuId() == e.getId()) {  

  20.                     map.put("checked"true);  

  21.                 }  

  22.             }  

  23.             mapList.add(map);  

  24.         }  

  25.   

  26.         return toJson(mapList);  

  27.     }  




service层

AuthManager.java


[java] view plain copy

  1. // 菜单管理  

  2.   

  3.     public List

     findMenuList(DynamicParams params) {  

  4.         List

     menus = new ArrayList();  

  5.   

  6.         if ("allMenu".equals(params.getString("allMenu"))) {  

  7.             menus = menuDao.findList(params);  

  8.         } else {  

  9.             // 通过用户查询角色  

  10.             List userRoles = userRoleDao.findList(params);  

  11.             // 通过角色查询菜单  

  12.             List roleMenus = new ArrayList();  

  13.             if (userRoles != null && userRoles.size() > 0) {  

  14.                 for (UserRole userRole : userRoles) {  

  15.                     params = new DynamicParams();  

  16.                     if (userRole != null) {  

  17.                         if (userRole.getRoleId().equals(params.getString("rid"))) {  

  18.                             break;  

  19.                         }  

  20.                         params.put("roleId", userRole.getRoleId().toString());  

  21.                         List rms = roleMenuDao.findList(params);  

  22.                         for (RoleMenu roleMenu : rms) {  

  23.                             roleMenus.add(roleMenu);  

  24.                         }  

  25.                     }  

  26.                 }  

  27.             }  

  28.   

  29.             // 查询菜单信息  

  30.             for (RoleMenu roleMenu : roleMenus) {  

  31.                 if (roleMenu != null) {  

  32.                     Menu menu = menuDao.find(roleMenu.getMenuId());  

  33.                     if (menu != null) {  

  34.                         menus.add(menu);  

  35.                     }  

  36.                 }  

  37.             }  

  38.             menus = removeDuplicate(menus);  

  39.             Collections.sort(menus);  

  40.         }  

  41.         return menus;  

  42.     }  

[java] view plain copy

  1. /** 

  2.      * 去除菜单中重复项 

  3.      *  

  4.      * @param list 

  5.      * @return 

  6.      */  

  7.     private List

     removeDuplicate(List list) {  

  8.         List

     result = new ArrayList();  

  9.         Set menuIds = new HashSet();  

  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.     }  


[java] view plain copy

  1. public List findRoleMenuList(DynamicParams params) {  

  2.         List roleMenus = roleMenuDao.findList(params);  

  3.         return roleMenus;  

  4.     }  



Dao层

menuDao

[java] view plain copy

  1. @Override  

  2.     protected void createQuery(DynamicParams params, StringBuffer sql, List args) {  

  3.         sql.append("select s.* from sys_menu s where 1=1 ");  

  4.   

  5.         String parentId = params.getString("parentId");  

  6.         if (StringUtils.isNotBlank(parentId)) {  

  7.             sql.append(" and parent_id = ? ");  

  8.             args.add(parentId);  

  9.         }  

  10.   

  11.         String sort = params.getString("sort");  

  12.         String order = params.getString("order");  

  13.   

  14.         if (StringUtils.isNotBlank(sort)) {  

  15.             sql.append(" order by ").append(hump2underline(sort));  

  16.             if (StringUtils.isNotBlank(order)) {  

  17.                 sql.append(" " + order);  

  18.             } else {  

  19.                 sql.append(" desc ");  

  20.             }  

  21.         } else {  

  22.             sql.append("order by sort asc,id desc ");  

  23.         }  

  24.     }  


  25. userRoleDao

    [java] view plain copy

    1. @Override  

    2.     protected void createQuery(DynamicParams params, StringBuffer sql, List 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.     }  


    10. roleMenuDao



      [java] view plain copy

      1. @Override  

      2.     protected void createQuery(DynamicParams params, StringBuffer sql, List 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.     }  



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


        [html] view plain copy

        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 taglibdescription>  

        6.     <display-name>permission taglibdisplay-name>  

        7.     <tlib-version>1.0tlib-version>  

        8.     <short-name>p2p_backshort-name>  

        9.     <uri>http://vanfon.p2p.cn/uri>  

        10.   

        11.     <tag>  

        12.         <description>权限校验标签,有权限就显示标签体的内容,否则不显示description>  

        13.         <name>permissionname>  

        14.         <tag-class>com.vanfon.p2p.back.tag.PermissionTagtag-class>  

        15.         <body-content>JSPbody-content>  

        16.         <attribute>  

        17.             <description>description>  

        18.             <name>modulename>  

        19.             <required>truerequired>  

        20.             <rtexprvalue>falsertexprvalue>  

        21.         attribute>  

        22.         <attribute>  

        23.             <description>description>  

        24.             <name>codename>  

        25.             <required>truerequired>  

        26.             <rtexprvalue>falsertexprvalue>  

        27.         attribute>  

        28.     tag>  

        29. taglib>span>  


        自定义标签类

        [java] view plain copy

        1. package com.vanfon.p2p.back.tag;  

        2.   

        3. import java.util.List;  

        4.   

        5. import javax.servlet.http.HttpServletRequest;  

        6. import javax.servlet.jsp.JspException;  

        7. import javax.servlet.jsp.tagext.TagSupport;  

        8.   

        9. import com.vanfon.p2p.entity.system.Admin;  

        10. import com.vanfon.p2p.entity.system.Menu;  

        11. import com.vanfon.p2p.manager.system.AuthManager;  

        12. import com.vanfon.p2p.utils.DynamicParams;  

        13. import com.vanfon.p2p.utils.SpringContextHolder;  

        14.   

        15. /** 

        16.  * 权限控制标签 

        17.  *  

        18.  * @author zhangwx 

        19.  * @date 2015-2-5 

        20.  */  

        21. public class PermissionTag extends TagSupport {  

        22.   

        23.     /** 

        24.      *  

        25.      */  

        26.     private static final long serialVersionUID = 4592227792811389132L;  

        27.   

        28.     private String module;// 属性名必须与JSP自定义标签的属性名一样  

        29.   

        30.     private String code;  

        31.   

        32.     public String getModule() {  

        33.         return module;  

        34.     }  

        35.   

        36.     public void setModule(String module) {  

        37.         this.module = module;  

        38.     }  

        39.   

        40.     public String getCode() {  

        41.         return code;  

        42.     }  

        43.   

        44.     public void setCode(String code) {  

        45.         this.code = code;  

        46.     }  

        47.   

        48.     @Override  

        49.     public int doStartTag() throws JspException {  

        50.         boolean result = false;  

        51.         HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();// 通过成员变量获取HttpServletRequest对象  

        52.         Admin admin = (Admin) request.getSession().getAttribute("admin");// 获取登录到系统的用户  

        53.         if (admin != null) {  

        54.             if ("1".equals(String.valueOf(admin.getIfsuper()))) {// 超级管理员  

        55.                 result = true;  

        56.             } else {  

        57.                 DynamicParams params = new DynamicParams();  

        58.                 params.put("id", String.valueOf(admin.getId()));  

        59.                 params.put("module"this.module);  

        60.                 params.put("code"this.code);  

        61.                 AuthManager authManager = SpringContextHolder.getBean(AuthManager.class);  

        62.                 List

           userRoleAuths = authManager.findUserRoleAuthList(params);  

        63.                 if (userRoleAuths != null && userRoleAuths.size() > 0) {  

        64.                     result = true;  

        65.                 }  

        66.             }  

        67.         }  

        68.         return result ? EVAL_BODY_INCLUDE : SKIP_BODY;  

        69.     }  

        70. }  





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





        • 没有任何评论
        个评论
        ONE源码官方

        ONE源码官方 (青铜)

        1316金币 (23)粉丝 (4)源码

        一切皆有可能!

         

        签到活跃榜 连续签到送额外金币
        最新博客
        基于SSM框架CRM客户管理系统 36
        基于SSM框架CRM客户管理系统 39
        Redis 虽然很牛,但不懂使用规范就糟了! 128
        打广告 205
        JSON PHP 358
        CSS 教程 310
        IT行业的发展应该发展宽度还是应该发展深度???? 247
        eclipse部署项目后,在tomcat中的webapps文件夹下没有项目文件 431
        SpringMVC标签form:options使用说明 406
        springboot 232