• 权限管理


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

    最近在做一个网站类型项目,主要负责后台,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. }  




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

     


  • 相关阅读:
    php获取http请求原文
    windows下安装MongoDB服务
    微服务RESTful 接口设计规范
    mysql主从复制原理及步骤
    nodejs主要框架
    redis事务机制和分布式锁
    计算机专业学生一定要学好这几门课
    redis常见7种使用场景
    js类型判断
    SQL语句:case when then的用法
  • 原文地址:https://www.cnblogs.com/lubolin/p/7575338.html
Copyright © 2020-2023  润新知