最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java web實(shí)現(xiàn)用戶權(quán)限管理

 更新時(shí)間:2015年11月23日 11:35:47   作者:Garry1115  
這篇文章主要介紹了java web實(shí)現(xiàn)用戶權(quán)限管理,設(shè)計(jì)并實(shí)現(xiàn)一套簡(jiǎn)單的權(quán)限管理功能,感興趣的小伙伴們可以參考一下

最近在做一個(gè)網(wǎng)站類型項(xiàng)目,主要負(fù)責(zé)后臺(tái),ui框架選型為jquery easy ui,項(xiàng)目架構(gòu)為spring mvc + spring jdbc,簡(jiǎn)單易用好上手!搭建好框架后開(kāi)始了第一個(gè)任務(wù),設(shè)計(jì)并實(shí)現(xiàn)一套簡(jiǎn)單的權(quán)限管理功能。

一套最基本的權(quán)限管理包括用戶、角色、資源。

實(shí)現(xiàn)效果:

數(shù)據(jù)庫(kù)設(shè)計(jì),設(shè)計(jì)如下:

用戶:user

角色:role

用戶-角色:user_role

資源:resource(包括上級(jí)菜單、子菜單、按鈕等資源)

角色-資源:role_resource

標(biāo)準(zhǔn)的權(quán)限管理系統(tǒng)設(shè)計(jì)為以上5張表。

注:用戶、用戶-角色我就不做說(shuō)明了,這兩個(gè)是很簡(jiǎn)單的兩塊,用戶的crud,以及為用戶分配角色(多對(duì)多的關(guān)系)稍微琢磨一下就清楚了,下面都是針對(duì)為角色分配權(quán)限的實(shí)現(xiàn)

后臺(tái)實(shí)現(xiàn)
展示層采用ztree樹(shù)

role.jsp

<%@ page contentType="text/html;charset=UTF-8"%> 
<%@ include file="/views/back/include/taglib.jsp"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta name="decorator" content="back" /> 
<script type="text/javaScript"> 
//打開(kāi)菜單窗口 
function openMenuDialog(){ 
 var selected = $("#list").datagrid('getSelected'); 
 if (selected != null) { 
  $("#id").val(selected.id); 
  queryMenus(selected.id); 
  $("#menuWindow").window("open"); 
 } else { 
  $.messager.alert('提示', "未選擇數(shù)據(jù)!"); 
 } 
} 
//角色-菜單信息入庫(kù) 
function ajaxSubmit(rid,idstr){ 
 $.post("${ctx}/roleMenu/save.jhtml",{"roleId":rid,"ids":idstr},function(obj){ 
  $.messager.alert('提示',obj.msg); 
  $("#menuWindow").window('close'); 
 },'json'); 
} 
</script> 
<!-- ztree --> 
<script type="text/javascript"> 
var tree = ""; 
var setting = { 
 check : { 
  chkboxType:{"Y":"ps","N":"s"},//勾選checkbox對(duì)于父子節(jié)點(diǎn)的關(guān)聯(lián)關(guān)系,取消勾選時(shí)不關(guān)聯(lián)父 
  chkStyle:"checkbox", 
  enable : true //是否復(fù)選框 
 }, 
 //數(shù)據(jù) 
 data : { 
  simpleData : { 
   enable : true 
  } 
 } 
}; 
//查詢菜單信息 
function queryMenus(roleId){ 
 $.post('${ctx}/role/treedata.jhtml', {'roleId':roleId}, function(zNodes) { 
  for (var i = 0; i < zNodes.length; i++) { 
   if (zNodes[i].isParent) { 
 
   } else { 
    //zNodes[i].icon = "${ctxStatic}/images/532.ico";//設(shè)置圖標(biāo) 
   } 
  } 
  tree = $.fn.zTree.init($("#tree"), setting, zNodes); 
  tree.expandAll(true);//全部展開(kāi) 
  //var nodes = treeObj.getNodes(); 
 }, 'json'); 
} 
 
//獲取選中節(jié)點(diǎn) 
function onCheck(){ 
  var rid = $("#id").val(); 
  var treeObj=$.fn.zTree.getZTreeObj("tree"); 
  var nodes=treeObj.getCheckedNodes(true); 
  var ids = new Array(); 
  for(var i=0;i<nodes.length;i++){ 
  //獲取選中節(jié)點(diǎn)的值 
   ids.push(nodes[i].id); 
  // v+=nodes[i].id + ","; 
  //alert(nodes[i].id); 
  } 
 ajaxSubmit(rid,ids);  
} 
</script> 
</head> 
<body> 
 <!-- 數(shù)據(jù)表格 --> 
 <table id="list" url='${ctx}/role/list/page.jhtml' method='post' 
  class="easyui-datagrid" style="width:100%;" fitcolumns="true" 
  toolbar='#tb' pagination='true' rownumbers='true' singleSelect='true'> 
  <thead> 
   <tr> 
    <th field='name' sortable='true' width='100'>角色名稱</th> 
    <th field='description' width='200' align='right'>描述</th> 
    <th field='createTimeFormat' width='150' align='center'>創(chuàng)建時(shí)間</th>     
   </tr> 
  </thead> 
 </table> 
  
 <!-- 編輯欄 --> 
 <div id="tb" style="padding:5px 5px;"> 
  <div> 
   <p2p:permission module="role" code="add"><a href="#" class="easyui-linkbutton" iconCls="icon-add" onclick="openCreateDialog();">新增</a></p2p:permission> 
   <p2p:permission module="role" code="edit"><a href="#" class="easyui-linkbutton" iconCls="icon-edit" onclick="openUpdateDialog();">編輯</a></p2p:permission> 
   <p2p:permission module="role" code="delete"><a href="#" class="easyui-linkbutton" iconCls="icon-remove" onclick="del();">刪除</a></p2p:permission> 
   <p2p:permission module="role" code="authority"><a href="#" class="easyui-linkbutton" iconCls="icon-edit" onclick="openMenuDialog();">設(shè)置權(quán)限</a></p2p:permission> 
  </div> 
  <!-- 搜索項(xiàng) --> 
  <div style="margin-top:5px;padding-left:5px"> 
   用戶名: <input id="query_name" class="easyui-textbox" type="text" style="width:110px" /> 
   創(chuàng)建日期: <input id="query_startDate" class="easyui-datebox" style="width:110px"> 
   至:  <input id="query_endDate" class="easyui-datebox" style="width:110px"> 
   <a onclick="reload();" href="#" class="easyui-linkbutton" iconCls="icon-search">查詢</a> 
  </div> 
 </div> 
  
  
  
 <!-- 權(quán)限窗口 --> 
 <div id="menuWindow" class="easyui-window" title="配置權(quán)限" data-options="modal:true,iconCls:'icon-save',footer:'#menuWindowfooter'" style="width:350px;height:420px;padding:10px"> 
  <div id="tree" class="ztree" style="padding: 10px 20px;"></div> 
 </div> 
 <div id="menuWindowfooter" style="padding:5px;text-align:right;"> 
  <a href="#" onclick="onCheck();" class="easyui-linkbutton" data-options="iconCls:'icon-save'">提交</a> 
 </div> 
  
</body> 
</html> 


action層
RoleAction.java

@RequestMapping(value = "/treedata.jhtml") 
 @ResponseBody 
 public String treedata(HttpServletRequest request, Model model) { 
  DynamicParams params = new DynamicParams(request); 
  List<Map<String, Object>> mapList = Lists.newArrayList(); 
 
  params.put("allMenu", "allMenu"); 
  List<Menu> list = authManager.findMenuList(params); 
 
  List<RoleMenu> roleMenus = authManager.findRoleMenuList(params); 
 
  for (int i = 0; i < list.size(); i++) { 
   Menu e = list.get(i); 
   Map<String, Object> map = Maps.newHashMap(); 
   map.put("id", e.getId()); 
   map.put("pId", e.getParentId() != null ? e.getParentId() : 0); 
   map.put("name", e.getName()); 
   for (RoleMenu roleMenu : roleMenus) { 
    if (roleMenu.getMenuId() == e.getId()) { 
     map.put("checked", true); 
    } 
   } 
   mapList.add(map); 
  } 
 
  return toJson(mapList); 
 } 

service層

AuthManager.java

// 菜單管理 
 
 public List<Menu> findMenuList(DynamicParams params) { 
  List<Menu> menus = new ArrayList<Menu>(); 
 
  if ("allMenu".equals(params.getString("allMenu"))) { 
   menus = menuDao.findList(params); 
  } else { 
   // 通過(guò)用戶查詢角色 
   List<UserRole> userRoles = userRoleDao.findList(params); 
   // 通過(guò)角色查詢菜單 
   List<RoleMenu> roleMenus = new ArrayList<RoleMenu>(); 
   if (userRoles != null && userRoles.size() > 0) { 
    for (UserRole userRole : userRoles) { 
     params = new DynamicParams(); 
     if (userRole != null) { 
      if (userRole.getRoleId().equals(params.getString("rid"))) { 
       break; 
      } 
      params.put("roleId", userRole.getRoleId().toString()); 
      List<RoleMenu> rms = roleMenuDao.findList(params); 
      for (RoleMenu roleMenu : rms) { 
       roleMenus.add(roleMenu); 
      } 
     } 
    } 
   } 
 
   // 查詢菜單信息 
   for (RoleMenu roleMenu : roleMenus) { 
    if (roleMenu != null) { 
     Menu menu = menuDao.find(roleMenu.getMenuId()); 
     if (menu != null) { 
      menus.add(menu); 
     } 
    } 
   } 
   menus = removeDuplicate(menus); 
   Collections.sort(menus); 
  } 
  return menus; 
 } 
/** 
  * 去除菜單中重復(fù)項(xiàng) 
  * 
  * @param list 
  * @return 
  */ 
 private List<Menu> removeDuplicate(List<Menu> list) { 
  List<Menu> result = new ArrayList<Menu>(); 
  Set<Long> menuIds = new HashSet<Long>(); 
  for (int i = 0; i < list.size(); i++) { 
   Menu m = list.get(i); 
   if (m != null && menuIds.add(m.getId())) { 
    result.add(m); 
   } 
  } 
  return result; 
 } 
public List<RoleMenu> findRoleMenuList(DynamicParams params) { 
  List<RoleMenu> roleMenus = roleMenuDao.findList(params); 
  return roleMenus; 
 } 

Dao層
menuDao

@Override 
 protected void createQuery(DynamicParams params, StringBuffer sql, List<Object> args) { 
  sql.append("select s.* from sys_menu s where 1=1 "); 
 
  String parentId = params.getString("parentId"); 
  if (StringUtils.isNotBlank(parentId)) { 
   sql.append(" and parent_id = ? "); 
   args.add(parentId); 
  } 
 
  String sort = params.getString("sort"); 
  String order = params.getString("order"); 
 
  if (StringUtils.isNotBlank(sort)) { 
   sql.append(" order by ").append(hump2underline(sort)); 
   if (StringUtils.isNotBlank(order)) { 
    sql.append(" " + order); 
   } else { 
    sql.append(" desc "); 
   } 
  } else { 
   sql.append("order by sort asc,id desc "); 
  } 
 } 

userRoleDao

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

roleMenuDao

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

在WEB-INF目錄下建立文件夾tlds 建立自定義標(biāo)簽文件shiros.tld,我們通過(guò)自定義標(biāo)簽實(shí)現(xiàn)頁(yè)面按鈕的控制。

<span style="color:#333333;"><?xml version="1.0" encoding="UTF-8" ?> 
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" 
 version="2.0"> 
 <description>p2p permission taglib</description> 
 <display-name>permission taglib</display-name> 
 <tlib-version>1.0</tlib-version> 
 <short-name>p2p_back</short-name> 
 <uri>http://vanfon.p2p.cn/</uri> 
 
 <tag> 
  <description>權(quán)限校驗(yàn)標(biāo)簽,有權(quán)限就顯示標(biāo)簽體的內(nèi)容,否則不顯示</description> 
  <name>permission</name> 
  <tag-class>com.vanfon.p2p.back.tag.PermissionTag</tag-class> 
  <body-content>JSP</body-content> 
  <attribute> 
   <description></description> 
   <name>module</name> 
   <required>true</required> 
   <rtexprvalue>false</rtexprvalue> 
  </attribute> 
  <attribute> 
   <description></description> 
   <name>code</name> 
   <required>true</required> 
   <rtexprvalue>false</rtexprvalue> 
  </attribute> 
 </tag> 
</taglib></span> 

自定義標(biāo)簽類

package com.vanfon.p2p.back.tag; 
 
import java.util.List; 
 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.jsp.JspException; 
import javax.servlet.jsp.tagext.TagSupport; 
 
import com.vanfon.p2p.entity.system.Admin; 
import com.vanfon.p2p.entity.system.Menu; 
import com.vanfon.p2p.manager.system.AuthManager; 
import com.vanfon.p2p.utils.DynamicParams; 
import com.vanfon.p2p.utils.SpringContextHolder; 
 
/** 
 * 權(quán)限控制標(biāo)簽 
 * 
 * @author zhangwx 
 * @date 2015-2-5 
 */ 
public class PermissionTag extends TagSupport { 
 
 /** 
  * 
  */ 
 private static final long serialVersionUID = 4592227792811389132L; 
 
 private String module;// 屬性名必須與JSP自定義標(biāo)簽的屬性名一樣 
 
 private String code; 
 
 public String getModule() { 
  return module; 
 } 
 
 public void setModule(String module) { 
  this.module = module; 
 } 
 
 public String getCode() { 
  return code; 
 } 
 
 public void setCode(String code) { 
  this.code = code; 
 } 
 
 @Override 
 public int doStartTag() throws JspException { 
  boolean result = false; 
  HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();// 通過(guò)成員變量獲取HttpServletRequest對(duì)象 
  Admin admin = (Admin) request.getSession().getAttribute("admin");// 獲取登錄到系統(tǒng)的用戶 
  if (admin != null) { 
   if ("1".equals(String.valueOf(admin.getIfsuper()))) {// 超級(jí)管理員 
    result = true; 
   } else { 
    DynamicParams params = new DynamicParams(); 
    params.put("id", String.valueOf(admin.getId())); 
    params.put("module", this.module); 
    params.put("code", this.code); 
    AuthManager authManager = SpringContextHolder.getBean(AuthManager.class); 
    List<Menu> userRoleAuths = authManager.findUserRoleAuthList(params); 
    if (userRoleAuths != null && userRoleAuths.size() > 0) { 
     result = true; 
    } 
   } 
  } 
  return result ? EVAL_BODY_INCLUDE : SKIP_BODY; 
 } 
} 

 

以上就是該權(quán)限管理中權(quán)限樹(shù)的大體實(shí)現(xiàn),完成了java web實(shí)現(xiàn)用戶權(quán)限管理的功能,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • 手把手教你實(shí)現(xiàn)idea中配置國(guó)內(nèi)源

    手把手教你實(shí)現(xiàn)idea中配置國(guó)內(nèi)源

    idea的國(guó)內(nèi)源配置十分重要,能夠提升程序開(kāi)發(fā)的效率而且也是減少bug的一種有效防范,本文就來(lái)介紹一下idea中配置國(guó)內(nèi)源,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-07-07
  • SpringBoot激活profiles的幾種方式

    SpringBoot激活profiles的幾種方式

    多環(huán)境是最常見(jiàn)的配置隔離方式之一,可以根據(jù)不同的運(yùn)行環(huán)境提供不同的配置信息來(lái)應(yīng)對(duì)不同的業(yè)務(wù)場(chǎng)景,這篇文章主要介紹了SpringBoot激活profiles的幾種方式,需要的朋友可以參考下
    2019-10-10
  • Spring Boot @Scheduled定時(shí)任務(wù)代碼實(shí)例解析

    Spring Boot @Scheduled定時(shí)任務(wù)代碼實(shí)例解析

    這篇文章主要介紹了Spring Boot @Scheduled定時(shí)任務(wù)代碼實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Spring注解之@Lazy注解使用解析

    Spring注解之@Lazy注解使用解析

    這篇文章主要介紹了Spring注解之@Lazy注解使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 深入淺析Java Object Serialization與 Hadoop 序列化

    深入淺析Java Object Serialization與 Hadoop 序列化

    序列化是指將結(jié)構(gòu)化對(duì)象轉(zhuǎn)化為字節(jié)流以便在網(wǎng)絡(luò)上傳輸或者寫到磁盤永久存儲(chǔ)的過(guò)程。下面通過(guò)本文給大家分享Java Object Serialization與 Hadoop 序列化,需要的朋友可以參考下
    2017-06-06
  • SpringBoot+Quartz實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)

    SpringBoot+Quartz實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)

    這篇文章主要為大家詳細(xì)介紹了springBoot+Quartz實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • java compiler沒(méi)有1.8怎么解決

    java compiler沒(méi)有1.8怎么解決

    這篇文章主要介紹了java compiler沒(méi)有1.8的解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • 基于Java回顧之I/O的使用詳解

    基于Java回顧之I/O的使用詳解

    我計(jì)劃在接下來(lái)的幾篇文章中快速回顧一下Java,主要是一些基礎(chǔ)的JDK相關(guān)的內(nèi)容
    2013-05-05
  • FuncGPT慧函數(shù)保護(hù)數(shù)據(jù)安全提高代碼質(zhì)量減少軟件故障(java示例)

    FuncGPT慧函數(shù)保護(hù)數(shù)據(jù)安全提高代碼質(zhì)量減少軟件故障(java示例)

    這篇文章主要為大家介紹了FuncGPT慧函數(shù)保護(hù)數(shù)據(jù)安全提高代碼質(zhì)量減少軟件故障(java示例),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • SpringBoot實(shí)現(xiàn)全局異常的封裝和統(tǒng)一處理

    SpringBoot實(shí)現(xiàn)全局異常的封裝和統(tǒng)一處理

    在Spring Boot應(yīng)用中,全局異常的處理是一個(gè)非常重要的方面,本文主要為大家詳細(xì)介紹了如何在Spring Boot中進(jìn)行全局異常的封裝和統(tǒng)一處理,需要的可以參考下
    2023-12-12

最新評(píng)論

桐庐县| 囊谦县| 沁源县| 平乐县| 大宁县| 浏阳市| 南木林县| 延长县| 交城县| 五指山市| 磴口县| 宣城市| 岳阳县| 湖南省| 湛江市| 古蔺县| 奇台县| 尼木县| 娄烦县| 深泽县| 禄劝| 科尔| 玉树县| 泽库县| 名山县| 中山市| 湘潭市| 铁力市| 财经| 六枝特区| 信丰县| 调兵山市| 广宗县| 德格县| 莱阳市| 巍山| 宝兴县| 阜南县| 新源县| 三明市| 香格里拉县|