轉帖|其它|編輯:郝浩|2010-08-30 12:01:28.000|閱讀 694 次
概述:本文主要講解Java實現權限管理的兩種方式,希望對大家有用。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
第一種方式:利用filter、xml文件和用戶信息表配合使用來實現權限管理。
1.過濾器filter
package cn.com.aaa.bbb.filter;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import cn.com.aaa.bbb.domain.User;
import cn.com.aaa.bbb.util.HttpUtils;
/**
* 過濾:后臺管理的模塊授權。根據:配置文件xml,根據當前session中用的管理員信息。
* 注:不用再訪問數據庫。也不需要再使用什么 bean 去判斷。直接在這個類里就可以判斷。
* @author cuiguangqiang
*
*/
public class ManagerAuthFilter implements Filter {
protected static final Log logger = LogFactory.getLog(ManagerAuthFilter.class);
public static final String MAPPING_FILE = "/WEB-INF/managerauthmapping.xml";
private ServletContext context = null;
private Map actions = new HashMap();
public void init(FilterConfig filterConfig) throws ServletException {
context = filterConfig.getServletContext();
if(context==null){
logger.error("unable to init as servlet context is null");
return;
}
loadConf();
logger.info("ManagerAuthFilter configure success.");
}
private void loadConf() {
InputStream inputStream = context.getResourceAsStream(MAPPING_FILE);
if (inputStream == null) {
logger.info("unable find auth mapping file " + MAPPING_FILE);
} else {
actions = parseConf(inputStream);
}
}
private Map parseConf(InputStream inputStream) {
try {
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
return createActionMap(document);
} catch (Exception e) {
logger.info(e.getMessage());
e.printStackTrace();
}
return new HashMap();
}
private Map createActionMap(Document document) {
Map map = new HashMap();
Element root = document.getRootElement();
//處理XML,讀入JAVA Object對象中。
List actionList = root.elements();
for (Iterator it = actionList.iterator(); it.hasNext();) {
Element e = (Element) it.next();
String actionName = e.attributeValue("name");
String auth_value = e.element("auth-value").getTextTrim();
map.put(actionName,auth_value);
logger.info(actionName + " is " + auth_value);
}
return map;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//處理某次提交的Action,是否在權限定義范圍內
//權限共有:1:站長;2:編輯;0:Admin ; all 代表所有人都可以。(均需要登錄)
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//(1)得到此次用戶的提交請求
String url = req.getServletPath();
//(2)只有在配置文件中存在的 action 才進行處理
String method = req.getParameter("method");
if(method!=null){
url = url + "?method=" + method;
}
String auth_value = (String)actions.get(url);
if(auth_value==null){
logger.info("action is not in Manager Auth xml.");
chain.doFilter(request, response);
return;
}
//第一,必須要登錄
// 取得當前用戶;
User manager = (User) HttpUtils.getAdminUserSession(req);
// 檢查管理用戶是否登錄
if (manager == null) {
resp.sendRedirect(req.getContextPath()+"/sessionLost.do");
return;
}
//第二,必須在權限定義范圍內
if(auth_value.indexOf("all")>=0){
chain.doFilter(request, response);//必須返回給上一層。
return ;
}
else{
// String currUserAuth = ","+Integer.toString( manager.getLever())+",";
String currUserAuth = Integer.toString( manager.getLever());
if(auth_value.indexOf(currUserAuth)>=0){
chain.doFilter(request, response);//必須返回給上一層。
return ;
}
else{
resp.sendRedirect(req.getContextPath()+"/accessdenied.do");
return ;
}
}
}
public void destroy() {
logger.info("in authfilter destroy");
}
}
2.xml文件
xml只給出了部分內容,不過所有的內容都包括了。
<?xml version="1.0" encoding="UTF-8"?>
<!--
權限共有:0:Admin 具有所有權限包括增刪改用戶; 1:站長 ;2:編輯;
-->
<mapping>
<!--xxxx管理模塊xx列表,報名選手和歷史比賽查詢部分-->
<action name="/listallmatch.do"><auth-value>0,1</auth-value></action>
<action name="/matchManager.do"><auth-value>0,</auth-value></action>
<action name="/rewrite.do"><auth-value>0,1</auth-value></action>
<action name="/leftHome.do"><auth-value>all,</auth-value></action>
<action name="/login.do"><auth-value>all,</auth-value></action>
</mapping>
3.用戶表里面有一個用來保存用戶級別的字段level,具體用戶表的信息有以下內容,我用實體類來表示用戶表的信息,因為沒有表結構了。
/** The composite primary key value.*/
private String id;
/**
* 用戶編號
*/
private String userId;
/** The value of the simple username property. */
private String username;
/** The value of the simple password property. */
private String password;
/**
* 0:Admin;1:站長;2:編輯;
*/
private int lever=1;
/**
* 創建用戶的日期
*/
private Date createDate;
所有的操作都顯示在頁面上,當點擊該操作時,才進行權限控制,拋出是否該用戶有沒有該功能的權限。
第二種方式:利用專門的權限表來維護用戶權限,根據登錄的用戶的權限信息判斷謀個功能是否顯示在頁面上,來實現權限的控制。
1.不用數據庫表了,我用實體類的屬性來表示。
private String id;
/**
* 管理員id
*/
private String employeeid;
/**
*管理功能id
*/
private String urlid;
/**
* 功能名稱
*/
private String urlname;
超級管理員給每一個用戶分配權限,然后添加到該張表中。登錄用戶根據自己的權限可以判斷是否顯示該功能。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載