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

java web简单权限管理设计

好文 1423
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源码官方 (青铜)

        1199金币 (0)粉丝 (0)源码

        一切皆有可能!

         

        签到活跃榜 连续签到送额外金币
        最新博客
        SpringBoot + jpa+mysql 民宿个性服务网 18
        不要想那么多 13
        做实施还是做开发 28
        MySQL一些随机函数记录 74
        mac安装RabbitMQ 100
        什么时候是一个员工离开公司的最好时机? 137
        1 95
        即将发布一个健身房管理系统 98
        即将发布一个健身房管理系统 100
        java 开发实战 96