權限的分配與使用
來源:程序員人生 發布時間:2015-04-24 07:58:33 閱讀次數:4212次
權限:控制功能的使用
web中權限的利用:
1、1個功能對應1個或多個URL
2、對功能的控制就是對URL地址訪問的控制
權限方案:
1、用戶的權限就是用戶的所有角色的權限的合集
2、1個功能是不是能被某用戶使用,是判斷用戶權限中是不是有這個功能的使用許可。
步驟:
1、初始化權限
權限是不可變的,在第1次使用時就已肯定了。所以我們可以 insert into。。。。
Session session=sessionFactory.getCurrentSession();
//保存超級管理員用戶
User user=new User();
user.setLoginName("admin");
user.setPassword(DigestUtils.md5Hex("admin"));
user.setName("超級管理員");
session.save(user);
//保存權限數據
Privilege menu,menu1,menu2,menu3;
menu=new Privilege("系統管理",null,null);
menu1=new Privilege("部門管理","/department_list",menu);
menu2=new Privilege("崗位管理","/role_list",menu);
menu3=new Privilege("用戶管理","/user_list",menu);
session.save(menu);
session.save(menu1);
session.save(menu2);
session.save(menu3);
session.save(new Privilege("部門列表","/department_list",menu1));
session.save(new Privilege("部門刪除","/department_delete",menu1));
session.save(new Privilege("部門添加","/department_add",menu1));
session.save(new Privilege("部門修改","/department_edit",menu1));
session.save(new Privilege("崗位列表","/role_list",menu2));
session.save(new Privilege("崗位刪除","/role_delete",menu2));
session.save(new Privilege("崗位添加","/role_add",menu2));
session.save(new Privilege("崗位修改","/role_edit",menu2));
session.save(new Privilege("用戶列表","user_list",menu3));
session.save(new Privilege("用戶刪除","user_delete",menu3));
session.save(new Privilege("用戶添加","user_add",menu3));
session.save(new Privilege("用戶修改","user_edit",menu3));
menu=new Privilege("網上交換",null,null);
menu1=new Privilege("論壇管理","/forumManage_list",menu);
menu2=new Privilege("論壇","/forum_list",menu);
session.save(menu);
session.save(menu1);
session.save(menu2);
2、分配權限
給角色分配權限,用戶的權限就是用戶的所有角色的權限的合集
分配權限類似于修改
public String setPrivilegeUI(){
//準備回顯數據
Role role=roleService.find(model.getId());
ActionContext.getContext().getValueStack().push(role);
if(role.getPrivileges()!=null){
privilegeIds=new Long[role.getPrivileges().size()];
int index=0;
for(Privilege privilege : role.getPrivileges()){
privilegeIds[index++]=privilege.getId();
}
}
// List<Privilege> list=privilegeService.getAll();
// ActionContext.getContext().put("list", list);
return "setPrivilegeUI";
}
/**
* 分配權限
* @return
*/
public String setPrivilege(){
//1、從
數據庫中獲得修改對象
Role role=roleService.find(model.getId());
//2、設置修改數據
List<Privilege> list=privilegeService.getByIds(privilegeIds);
role.setPrivileges(new HashSet<Privilege>(list));
//3、更新到
數據庫
roleService.save(role);
return "toList";
}
jsp頁面-----顯示樹狀結構
<%@ page language="java" import="java.util.*" pageEncoding="UTF⑻"%>
<%@include file="/WEB-INF/jsp/public/commons.jspf"%>
<html>
<head>
<title>配置權限</title>
<script language="javascript"
src="${pageContext.request.contextPath }/script/
jquery_treeview/
jquery.treeview.js"></script>
<link type="text/css" rel="stylesheet"
href="${pageContext.request.contextPath }/style/blue/file.css" />
<link type="text/css" rel="stylesheet"
href="${pageContext.request.contextPath }/script/
jquery_treeview/
jquery.treeview.css" />
<script type="text/javascript">
$(function(){
$("[name=privilegeIds]").click(function(){
//當選中或取消權限時,也同時選中或取消下級元素
$(this).siblings("ul").find("input").attr("checked",this.checked);
//當選中1個權限時,也同時選中直接上級
if(this.checked==true){
$(this).parents("li").children("input").attr("checked",true);
}
});
});
$(function() {
$("#tree").treeview();
});
</script>
</head>
<body>
<!-- 標題顯示 -->
<div id="Title_bar">
<div id="Title_bar_Head">
<div id="Title_Head"></div>
<div id="Title">
<!--頁面標題-->
<img border="0" width="13" height="13"
src="${pageContext.request.contextPath }/style/images/title_arrow.gif" />
配置權限
</div>
<div id="Title_End"></div>
</div>
</div>
<!--顯示表單內容-->
<div id=MainArea>
<s:form action="role_setPrivilege">
<s:hidden name="id"></s:hidden>
<div class="ItemBlock_Title1">
<!-- 信息說明 -->
<div class="ItemBlock_Title1">
<img border="0" width="4" height="7"
src="${pageContext.request.contextPath }/style/blue/images/item_point.gif" />
正在為【${name } }】配置權限
</div>
</div>
<!-- 表單內容顯示 -->
<div class="ItemBlockBorder">
<div class="ItemBlock">
<table cellpadding="0" cellspacing="0" class="mainForm">
<!--表頭-->
<thead>
<tr align="LEFT" valign="MIDDLE" id="TableTitle">
<td width="300px" style="padding-left: 7px;">
<!-- 如果把全選元素的id指定為selectAll,并且有函數selectAll(),就會有錯。由于有1種用法:可以直接用id援用元素 -->
<input type="CHECKBOX" id="cbSelectAll"
onClick="$('[name=privilegeIds]').attr('checked',this.checked)" />
<label for="cbSelectAll">全選</label>
</td>
</tr>
</thead>
<!--顯示數據列表-->
<tbody id="TableData">
<tr class="TableDetail1">
<!-- 顯示權限樹 -->
<td>
<!--
<s:checkboxlist name="privilegeIds" list="#list"
listKey="id" listValue="name"></s:checkboxlist>
-->
<%--
<s:iterator value="#list">
<input type="checkbox" name="privilegeIds" value="${id }" id="lb_${id }"
<s:property value="%{id in privilegeIds ? 'checked' : '' }"/>
/>
<label for="lb_${id }">${name }</label>
<br/>
</s:iterator>
--%>
<ul id="tree">
<s:iterator value="#application.topPrivilegeList">
<li>
<input type="checkbox" name="privilegeIds" value="${id }" id="lb_${id }" <s:property value="%{id in privilegeIds ? 'checked' : '' }"/>/>
<label for="lb_${id }"><span class="folder">${name }</span></label>
<ul>
<s:iterator value="children">
<li>
<input type="checkbox" name="privilegeIds" value="${id }" id="lb_${id }" <s:property value="%{id in privilegeIds ? 'checked' : '' }"/>/>
<label for="lb_${id }"><span class="folder">${name }</span></label>
<ul>
<s:iterator value="children">
<li><input type="checkbox" name="privilegeIds" value="${id }" id="lb_${id }" <s:property value="%{id in privilegeIds ? 'checked' : '' }"/>/>
<label for="lb_${id }"><span class="folder">${name }</span></label></li>
</s:iterator>
</ul>
</li>
</s:iterator>
</ul>
</li>
</s:iterator>
</ul>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 表單操作 -->
<div id="InputDetailBar">
<input type="image"
src="${pageContext.request.contextPath }/style/images/save.png" />
<a href="javascript:history.go(⑴);"><img
src="${pageContext.request.contextPath }/style/images/goBack.png" /></a>
</div>
</s:form>
</div>
<div class="Description">
說明:<br /> 1,選中1個權限時:<br /> a,應當選中 他的所有直系上級。<br />
b,應當選中他的所有直系下級。<br /> 2,取消選擇1個權限時:<br />
a,應當取消選擇 他的所有直系下級。<br />
b,如果同級的權限都是未選擇狀態,就應當取消選中他的直接上級,并遞歸向上做這個操作。<br />
3,全選/取消全選。<br /> 4,默許選中當前崗位已有的權限。<br />
</div>
</body>
</html>
3、根據權限顯示菜單
<div id="Menu">
<ul id="MenuUl">
<%--顯示1級菜單 --%>
<s:iterator value="#application.topPrivilegeList">
<s:if test="#session.user.hasPrivilegeByName(name)">
<li class="level1">
<div onClick="menuClick(this)" class="level1Style">
<img src="style/images/MenuIcon/${id }.gif" class="Icon" />${name }
</div>
<ul id="aa" class="MenuLevel2">
<%--顯示2級菜單 --%>
<s:iterator value="children">
<s:if test="#session.user.hasPrivilegeByName(name)">
<li class="level2">
<div class="level2Style">
<img src="style/images/MenuIcon/menu_arrow_single.gif" />
<a target="body" href="${pageContext.request.contextPath }${url}.action">${name }</a>
</div>
</li>
</s:if>
</s:iterator>
</ul>
</li>
</s:if>
</s:iterator>
</ul>
</div>
4、根據權限顯示鏈接
重寫<s:a></s:a>標簽
public int doEndTag() throws JspException {
User user=(User) pageContext.getSession().getAttribute("user");
String privUrl="/"+action;
if(user.hasPrivilegeByUrl(privUrl)){
return super.doEndTag();
}else{
return EVAL_PAGE;
}
}
5.攔截每個action要求,驗證用戶是不是有權限訪問
用struts的 interceptor攔截
public String intercept(ActionInvocation invocation) throws Exception {
String result=null;
User user= (User) ActionContext.getContext().getSession().get("user");
String namespace=invocation.getProxy().getNamespace();
String actionName=invocation.getProxy().getActionName();
String privUrl=namespace+actionName;
//未登入,轉到登入頁面
if(user==null){
//如果是去登入,就放行
if(privUrl.startsWith("/user_login")){
return invocation.invoke();
}else{
//如果不是去登入,就轉到登入頁面
return "loginUI";
}
}
//已登入,判斷是不是有權限
else{
if(user.hasPrivilegeByUrl(privUrl)){
//有,放行
return invocation.invoke();
}else{
//無,轉到提示頁面
return "noPrivilege";
}
}
}

補上怎樣判斷用戶是不是有權限的代碼
/**
* 判斷本用戶是不是有指定的名稱權限
*
* @return
*/
public boolean hasPrivilegeByName(String name) {
// 超級管理員
if (isAdmin()) {
return true;
}
// 普通用戶
for (Role role : roles) {
for (Privilege privilege : role.getPrivileges()) {
if (privilege.getName().equals(name)) {
return true;
}
}
}
return false;
}
/**
* 判斷本用戶是不是有指定的url權限
*
* @return
*/
public boolean hasPrivilegeByUrl(String privUrl) {
// 超級管理員
if (isAdmin()) {
return true;
}
int pos = privUrl.indexOf("?");
if (pos > ⑴) {
privUrl = privUrl.substring(0, pos);
if (privUrl.endsWith("UI")) {
privUrl = privUrl.substring(0, privUrl.length() - 2);
}
}
Collection<Privilege> allPrivilege = (Collection<Privilege>) ActionContext.getContext().getApplication().get("allPrivilege");
// 如果本url不需要控制,則登入用戶就能夠使用
if (!allPrivilege.contains(privUrl)) {
return true;
} else {
// 普通用戶
for (Role role : roles) {
for (Privilege privilege : role.getPrivileges()) {
if (privUrl.equals(privilege.getUrl())) {
return true;
}
}
}
}
return false;
}
/**
* 判斷本用戶是否是超級用戶
*
* @return
*/
private boolean isAdmin() {
return "admin".equals(loginName);
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈