zoukankan      html  css  js  c++  java
  • 权限管理

    权限管理简单设计,原创文章地址

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

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

    数据库设计

    我的设计如下:

    用户:user

    角色:role

    用户-角色:user_role

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

    角色-资源:role_resource

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

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

    后台实现

    展示层采用ztree树
     

    role.jsp

    [html] 
     
    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.   
    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="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"><href="#" class="easyui-linkbutton" iconCls="icon-add" onclick="openCreateDialog();">新增</a></p2p:permission>  
    93.             <p2p:permission module="role" code="edit"><href="#" class="easyui-linkbutton" iconCls="icon-edit" onclick="openUpdateDialog();">编辑</a></p2p:permission>  
    94.             <p2p:permission module="role" code="delete"><href="#" class="easyui-linkbutton" iconCls="icon-remove" onclick="del();">删除</a></p2p:permission>  
    95.             <p2p:permission module="role" code="authority"><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="110px" />  
    100.             创建日期: <input id="query_startDate" class="easyui-datebox" style="110px">  
    101.             至:     <input id="query_endDate" class="easyui-datebox" style="110px">  
    102.             <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="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.         <href="#" onclick="onCheck();" class="easyui-linkbutton" data-options="iconCls:'icon-save'">提交</a>  
    114.     </div>  
    115.       
    116. </body>  
    117. </html>  

     

    action层
    RoleAction.java

    [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.   
    7.         params.put("allMenu", "allMenu");  
    8.         List<Menu> list = authManager.findMenuList(params);  
    9.   
    10.         List<RoleMenu> roleMenus = authManager.findRoleMenuList(params);  
    11.   
    12.         for (int i = 0; i < list.size(); i++) {  
    13.             Menu e = list.get(i);  
    14.             Map<String, Object> 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] 
     
    1. // 菜单管理  
    2.   
    3.     public List<Menu> findMenuList(DynamicParams params) {  
    4.         List<Menu> menus = new ArrayList<Menu>();  
    5.   
    6.         if ("allMenu".equals(params.getString("allMenu"))) {  
    7.             menus = menuDao.findList(params);  
    8.         } else {  
    9.             // 通过用户查询角色  
    10.             List<UserRole> userRoles = userRoleDao.findList(params);  
    11.             // 通过角色查询菜单  
    12.             List<RoleMenu> roleMenus = new ArrayList<RoleMenu>();  
    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<RoleMenu> 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] 
     
    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.     }  
    [java] 
     
    1. public List<RoleMenu> findRoleMenuList(DynamicParams params) {  
    2.         List<RoleMenu> roleMenus = roleMenuDao.findList(params);  
    3.         return roleMenus;  
    4.     }  

    Dao层

    menuDao

    [java] 
     
    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.   
    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.     }  


    userRoleDao

    [java]
     
    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

    [java] 
     
    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,我们通过自定义标签实现页面按钮的控制。

    [html] 
     
    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.   
    11.     <tag>  
    12.         <description>权限校验标签,有权限就显示标签体的内容,否则不显示</description>  
    13.         <name>permission</name>  
    14.         <tag-class>com.vanfon.p2p.back.tag.PermissionTag</tag-class>  
    15.         <body-content>JSP</body-content>  
    16.         <attribute>  
    17.             <description></description>  
    18.             <name>module</name>  
    19.             <required>true</required>  
    20.             <rtexprvalue>false</rtexprvalue>  
    21.         </attribute>  
    22.         <attribute>  
    23.             <description></description>  
    24.             <name>code</name>  
    25.             <required>true</required>  
    26.             <rtexprvalue>false</rtexprvalue>  
    27.         </attribute>  
    28.     </tag>  
    29. </taglib></span>  

      

    自定义标签类 

    [java] 
     
    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<Menu> 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. }  




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

     


  • 相关阅读:
    A1052. Linked List Sorting (25)
    A1032. Sharing (25)
    A1022. Digital Library (30)
    A1071. Speech Patterns (25)
    A1054. The Dominant Color (20)
    A1060. Are They Equal (25)
    A1063. Set Similarity (25)
    电子码表
    矩阵键盘
    对象追踪、临时对象追踪、绝对坐标与相对坐标
  • 原文地址:https://www.cnblogs.com/lubolin/p/7575338.html
Copyright © 2011-2022 走看看