Spring框架下實現(xiàn)基于組的用戶權(quán)限管理_JSP教程
推薦:選擇JSF不選Struts的十大理由我的一個客戶不知道該選用Struts還是JSF。就像你預(yù)料的那樣,我通常會問:這2中框架之間有什么區(qū)別?當(dāng)然,除了我的這個客戶外很多人都面臨這樣的選擇。 總的來說,我建議
在幾乎所有的web應(yīng)用中都需要對訪問者(用戶)進(jìn)行權(quán)限管理, 因為我們希望某些頁面只對特定的用戶開放, 以及某些操作只有符合身份的用戶才能進(jìn)行。這之中涉及到了身份驗證和權(quán)限管理. 只有單用戶系統(tǒng)和多用戶單權(quán)限系統(tǒng)才不需要權(quán)限管理。
在本文中, 使用了基于組的權(quán)限管理, 并在Spring框架下利用HandlerInterceptorAdapter和Hibernate進(jìn)行實現(xiàn)。
User的結(jié)構(gòu)是:
public class User {
private int id;
private String name;
private String password;
private Set<String> groups = new HashSet<String>();
}
UserGroup表:
user:intgroup:String使用聯(lián)合主鍵, 在Java中沒有對應(yīng)的類。
Hibernate映射文件是:
<hibernate-mapping auto-import="true" default-lazy="false">
�。糲lass name="net.ideawu.User" table="User">
<cache usage="read-write" />
�。糹d name="id" column="id">
<generator class="native"/>
�。�/id>
<property name="name" column="name"/>
�。紁roperty name="password" column="password"/>
�。約et name="groups" table="UserGroup" cascade="save-update" lazy="false">
<key column="user" />
�。糴lement column="`group`" type="string" />
�。�/set>
</class>
</hibernate-mapping>
一切的身份驗證交給一個繼承HandlerInterceptorAdapter的類來做:
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.util.UrlPathHelper;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;
...
public class AuthorizeInterceptor extends HandlerInterceptorAdapter {
private UrlPathHelper urlPathHelper = new UrlPathHelper();
private PathMatcher pathMatcher = new AntPathMatcher();
private Properties groupMappings;
/** * Attach URL paths to group. */
public void setGroupMappings(Properties groupMappings) {
this.groupMappings = groupMappings;
}
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url = urlPathHelper.getLookupPathForRequest(request);
String group = lookupGroup(url);
// 找出資源所需要的權(quán)限, 即組名
if(group == null){
// 所請求的資源不需要保護(hù).
return true;
}
// 如果已經(jīng)登錄, 一個User實例被保存在session中.
User loginUser = (User)request.getSession().getAttribute("loginUser");
ModelAndView mav = new ModelAndView("system/authorizeError");
if(loginUser == null){
mav.addObject("errorMsg", "你還沒有登錄!");
throw new ModelAndViewDefiningException(mav);
}else{
if(!loginUser.getGroups().contains(group)){
mav.addObject("errorMsg", "授權(quán)失敗! 你不在 <b>" group "</b> 組!");
throw new ModelAndViewDefiningException(mav);
} return true;
}
}
/* * 查看
org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.lookupHandler()
* Ant模式的最長子串匹配法.
*/
private String lookupGroup(String url){
String group = groupMappings.getProperty(url);
if (group == null) {
String bestPathMatch = null;
for (Iterator it = this.groupMappings.keySet().iterator();it.hasNext();) {
String registeredPath = (String) it.next();
if (this.pathMatcher.match(registeredPath, url) && (bestPathMatch == null || bestPathMatch.length() <= registeredPath.length())) {
group = this.groupMappings.getProperty(registeredPath);
bestPathMatch = registeredPath;
}
}
}
return group;
}
}
下面我們需要在Spring的應(yīng)用上下文配置文件中設(shè)置:
<bean id="authorizeInterceptor" class="net.ideawu.AuthorizeInterceptor">
�。紁roperty name="groupMappings">
�。紇alue>
�。�!-- Attach URL paths to group -->
/admin/*=admin
</value>
�。�/property>
</bean>
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
�。糽ist>
<ref bean="authorizeInterceptor" /> </list>
�。�/property>
�。紁roperty name="mappings">
�。紇alue>
/index.do=indexController /browse.do=browseController /admin/removeArticle.do=removeArticleController
�。�/value>
�。�/property>
</bean>
注意到"/admin/*=admin", 所以/admin目錄下的所有資源只有在admin組的用戶才能訪問, 這樣就不用擔(dān)心普通訪客刪除文章了。使用這種方法, 你不需要在removeArticleController中作身份驗證和權(quán)限管理, 一切都交給AuthorizeInterceptor。
分享:CNET JSP BASIC 簡介JavaServer Pages (JSP) 是一種結(jié)合了跨平臺與跨網(wǎng)站服務(wù)器支持,以 Java為主的來產(chǎn)生動態(tài)網(wǎng)頁的技術(shù)。 JSP與微軟的Active Server Pages 相似,但它是使用類似HTML的標(biāo)
- jsp response.sendRedirect不跳轉(zhuǎn)的原因分析及解決
- JSP指令元素(page指令/include指令/taglib指令)復(fù)習(xí)整理
- JSP腳本元素和注釋復(fù)習(xí)總結(jié)示例
- JSP FusionCharts Free顯示圖表 具體實現(xiàn)
- 網(wǎng)頁模板:關(guān)于jsp頁面使用jstl的異常分析
- JSP頁面中文傳遞參數(shù)使用escape編碼
- 基于jsp:included的使用與jsp:param亂碼的解決方法
- Java Web項目中連接Access數(shù)據(jù)庫的配置方法
- JDBC連接Access數(shù)據(jù)庫的幾種方式介紹
- 網(wǎng)站圖片路徑的問題:絕對路徑/虛擬路徑
- (jsp/html)網(wǎng)頁上嵌入播放器(常用播放器代碼整理)
- jsp下顯示中文文件名及絕對路徑下的圖片解決方法
- 相關(guān)鏈接:
- 教程說明:
JSP教程-Spring框架下實現(xiàn)基于組的用戶權(quán)限管理
。