




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Spring Security主講:柴炎星2011-03-28流程介紹Spring Security 簡介Spring Security 11種過濾器介紹Spring Security 基本配置Spring Security 總結(jié)Spring Security Spring Security 簡介 這里提到的Spring Security也就是被大家廣為熟悉的Acegi Security,2007年底Acegi Security正式成為Spring Portfolio項(xiàng)目,并更名為Spring Security。Spring Security是一個(gè)能夠?yàn)榛赟pring的企業(yè)應(yīng)用系統(tǒng)提供描述性
2、安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應(yīng)用上下文中配置的Bean,充分利用了Spring IoC(依賴注入,也稱控制反轉(zhuǎn))和AOP(面向切面編程)功能,為應(yīng)用系統(tǒng)提供聲明式的安全訪問控制功能,減少了為企業(yè)系統(tǒng)安全控制編寫大量重復(fù)代碼的工作。 如今的Spring Security已經(jīng)成為Spring Framework下最成熟的安全系統(tǒng),它為我們提供了強(qiáng)大而靈活的企業(yè)級(jí)安全服務(wù),如: 認(rèn)證授權(quán)機(jī)制 Web資源訪問控制 業(yè)務(wù)方法調(diào)用訪問控制 領(lǐng)域?qū)ο笤L問控制Access Control List(ACL) 單點(diǎn)登錄(Central Authentication Servic
3、e) X509認(rèn)證 信道安全(Channel Security)管理等功能 當(dāng)保護(hù)Web資源時(shí),Spring Security使用Servlet 過濾器來攔截Http請(qǐng)求進(jìn)行身份驗(yàn)證并強(qiáng)制安全性,以確保WEB資源被安全的訪問。無論是保護(hù)WEB資源還是保護(hù)業(yè)務(wù)方法或者領(lǐng)域?qū)ο?,Spring Security都是通過上圖中的組件來完成的。本文主要闡述如何使用Spring Security對(duì)WEB應(yīng)用程序的資源進(jìn)行安全訪問控制,并通過一個(gè)簡單的實(shí)例來對(duì)Spring Security提供的各種過濾器的功能和配置方法進(jìn)行描述。 Spring Security 11種過濾器介紹HttpSessionCon
4、textIntegrationFilter位于過濾器頂端,第一個(gè)起作用的過濾器。用途一,在執(zhí)行其他過濾器之前,率先判斷用戶的session中是否已經(jīng)存在一個(gè)SecurityContext了。如果存在,就把SecurityContext拿出來,放到SecurityContextHolder中,供Spring Security的其他部分使用。如果不存在,就創(chuàng)建一個(gè)SecurityContext出來,還是放到SecurityContextHolder中,供Spring Security的其他部分使用。用途二,在所有過濾器執(zhí)行完畢后,清空SecurityContextHolder,因?yàn)镾ecurity
5、ContextHolder是基于ThreadLocal的,如果在操作完成后清空ThreadLocal,會(huì)受到服務(wù)器的線程池機(jī)制的影響。LogoutFilter只處理注銷請(qǐng)求,默認(rèn)為/j_spring_security_logout。用途是在用戶發(fā)送注銷請(qǐng)求時(shí),銷毀用戶session,清空SecurityContextHolder,然后重定向到注銷成功頁面??梢耘crememberMe之類的機(jī)制結(jié)合,在注銷的同時(shí)清空用戶cookie。AuthenticationProcessingFilter處理form登陸的過濾器,與form登陸有關(guān)的所有操作都是在此進(jìn)行的。默認(rèn)情況下只處理/j_spring_
6、security_check請(qǐng)求,這個(gè)請(qǐng)求應(yīng)該是用戶使用form登陸后的提交地址。此過濾器執(zhí)行的基本操作時(shí),通過用戶名和密碼判斷用戶是否有效,如果登錄成功就跳轉(zhuǎn)到成功頁面(可能是登陸之前訪問的受保護(hù)頁面,也可能是默認(rèn)的成功頁面),如果登錄失敗,就跳轉(zhuǎn)到失敗頁面。 登陸 用戶: 密碼: 兩周之內(nèi)不必登陸 /j_spring_security_check,提交登陸信息的URL地址。自定義form時(shí),要把form的action設(shè)置為/j_spring_security_check。注意這里要使用絕對(duì)路徑,避免登陸頁面存放的頁面可能帶來的問題。 j_username,輸入登陸名的參數(shù)名稱。 j_pas
7、sword,輸入密碼的參數(shù)名稱 _spring_security_remember_me,選擇是否允許自動(dòng)登錄的參數(shù)名稱。可以直接把這個(gè)參數(shù)設(shè)置為一個(gè)checkbox,無需設(shè)置value,Spring Security會(huì)自行判斷它是否被選中。DefaultLoginPageGeneratingFilter此過濾器用來生成一個(gè)默認(rèn)的登錄頁面,默認(rèn)的訪問地址為/spring_security_login,這個(gè)默認(rèn)的登錄頁面雖然支持用戶輸入用戶名,密碼,也支持rememberMe功能,但是因?yàn)樘y看了,只能是在演示時(shí)做個(gè)樣子,不可能直接用在實(shí)際項(xiàng)目中。自定義登陸頁面 BasicProcessingF
8、ilterBasicProcessingFilter 此過濾器用于進(jìn)行basic驗(yàn)證,功能與AuthenticationProcessingFilter類似,只是驗(yàn)證的方式不同。添加basic認(rèn)證,去掉auto-config=true,并加上 SecurityContextHolderAwareRequestFilter 此過濾器用來包裝客戶的請(qǐng)求。目的是在原始請(qǐng)求的基礎(chǔ)上,為后續(xù)程序提供一些額外的數(shù)據(jù)。比如getRemoteUser()時(shí)直接返回當(dāng)前登陸的用戶名之類的。ExceptionTranslationFilter此過濾器的作用是處理中FilterSecurityInterceptor
9、拋出的異常,然后將請(qǐng)求重定向到對(duì)應(yīng)頁面,或返回對(duì)應(yīng)的響應(yīng)錯(cuò)誤代碼。RememberMeProcessingFilterRememberMeProcessingFilter 此過濾器實(shí)現(xiàn)RememberMe功能,當(dāng)用戶cookie中存在rememberMe的標(biāo)記,此過濾器會(huì)根據(jù)標(biāo)記自動(dòng)實(shí)現(xiàn)用戶登陸,并創(chuàng)建SecurityContext,授予對(duì)應(yīng)的權(quán)限。在配置文件中使用auto-config=true就會(huì)自動(dòng)啟用rememberMe實(shí)際上,Spring Security中的rememberMe是依賴cookie實(shí)現(xiàn)的,當(dāng)用戶在登錄時(shí)選擇使用rememberMe,系統(tǒng)就會(huì)在登錄成功后將為用戶生成一個(gè)
10、唯一標(biāo)識(shí),并將這個(gè)標(biāo)識(shí)保存進(jìn)cookie中,我們可以通過瀏覽器查看用戶電腦中的cookie。AnonymousProcessingFilterAnonymousProcessingFilter 為了保證操作統(tǒng)一性,當(dāng)用戶沒有登陸時(shí),默認(rèn)為用戶分配匿名用戶的權(quán)限。在配置文件中使用auto-config=true就會(huì)啟用匿名登錄功能。在啟用匿名登錄之后,如果我們希望允許未登錄就可以訪問一些資源,可以在進(jìn)行如下配置。 設(shè)置成 ROLE_ANONYMOUS 也可以。 filters=none表示當(dāng)我們?cè)L問“/”時(shí),是不會(huì)使用任何一個(gè)過濾器去處理這個(gè)請(qǐng)求的,它可以實(shí)現(xiàn)無需登錄即可訪問資源的效果,但是因?yàn)?/p>
11、沒有使用過濾器對(duì)請(qǐng)求進(jìn)行處理,所以也無法利用安全過濾器為我們帶來的好處,最簡單的,這時(shí)SecurityContext內(nèi)再?zèng)]有保存任何一個(gè)權(quán)限主體了,我們也無法從中取得主體名稱以及對(duì)應(yīng)的權(quán)限信息。ExceptionTranslationFilterExceptionTranslationFilter 此過濾器的作用是處理中FilterSecurityInterceptor拋出的異常,然后將請(qǐng)求重定向到對(duì)應(yīng)頁面,或返回對(duì)應(yīng)的響應(yīng)錯(cuò)誤代碼。SessionFixationProtectionFilterSessionFixationProtectionFilter 防御會(huì)話偽造攻擊。解決session
12、 fix的問題其實(shí)很簡單,只要在用戶登錄成功之后,銷毀用戶的當(dāng)前session,并重新生成一個(gè)session就可以了。 session-fixation-protection的值共有三個(gè)可供選擇,none,migrateSession和newSession。默認(rèn)使用的是migrationSessionFilterSecurityInterceptor用戶的權(quán)限控制都包含在這個(gè)過濾器中。功能一:如果用戶尚未登陸,則拋出AuthenticationCredentialsNotFoundException“尚未認(rèn)證異?!?。功能二:如果用戶已登錄,但是沒有訪問當(dāng)前資源的權(quán)限,則拋出AccessDeni
13、edException“拒絕訪問異常”。功能三:如果用戶已登錄,也具有訪問當(dāng)前資源的權(quán)限,則放行。至此,我們完全展示了默認(rèn)情況下Spring Security中使用到的過濾器,以及每個(gè)過濾器的應(yīng)用場(chǎng)景和顯示功能,下面我們會(huì)對(duì)這些過濾器的配置和用法進(jìn)行逐一介紹。Spring Security 基本配置最小化配置 1. 在web.xml文件中加入Filter聲明 Xml代碼 springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain /* 這個(gè)Fil
14、ter會(huì)攔截所有的URL請(qǐng)求,并且對(duì)這些URL請(qǐng)求進(jìn)行Spring Security的驗(yàn)證。 注意,springSecurityFilterChain這個(gè)名稱是由命名空間默認(rèn)創(chuàng)建的用于處理web安全的一個(gè)內(nèi)部的bean的id。所以你在你的Spring配置文件中,不應(yīng)該再使用這個(gè)id作為你的bean。 2. 使用最小的配置 Xml代碼 這段配置表示:1:只有擁有ROLE_ADMIN角色的用戶才可以訪問/admin.jsp。2:擁有ROLE_USER角色的用戶,可以訪問應(yīng)用程序中的所有URL。你可以使用多個(gè)元素為不同URL的集合定義不同的訪問需求,它們會(huì)被歸入一個(gè)有序隊(duì)列中,每次取出最先匹配的一個(gè)
15、元素使用。 所以你必須把期望使用的匹配條件放到最上邊。 自定義登錄頁面 讓沒登陸的用戶也可以訪問login.jsp。這是因?yàn)榕渲梦募械摹?*”配置,要求用戶訪問任意一個(gè)系統(tǒng)資源時(shí),必須擁有ROLE_USER角色,/login.jsp也不例外,如果我們不為/login.jsp單獨(dú)配置訪問權(quán)限,會(huì)造成用戶連登陸的權(quán)限都沒有,這是不正確的。 login-page表示用戶登陸時(shí)顯示我們自定義的login.jsp。這時(shí)我們?cè)L問系統(tǒng)顯示的登陸頁面將是我們上面創(chuàng)建的login.jsp。 authentication-failure-url表示用戶登陸失敗時(shí),跳轉(zhuǎn)到哪個(gè)頁面。當(dāng)用戶輸入的登錄名和密碼不正確時(shí)
16、,系統(tǒng)將再次跳轉(zhuǎn)到/login.jsp,并添加一個(gè)error=true參數(shù)作為登陸失敗的標(biāo)示。 default-target-url表示登陸成功時(shí),跳轉(zhuǎn)到哪個(gè)頁面剖析基本配置元素 1. 有關(guān)auto-config屬性 在上面用到的auto-config屬性,其實(shí)是下面這些配置的縮寫: Xml代碼 這些元素分別與登錄認(rèn)證,匿名認(rèn)證,基本認(rèn)證,注銷處理和remember-me對(duì)應(yīng)。 他們擁有各自的屬性,可以改變他們的具體行為。 這樣,我們?cè)贏cegi中所熟悉的元素又浮現(xiàn)在我們的面前(備注)。只是在這里,我們使用的是命名空間而已。 這些過濾器已經(jīng)被Spring容器默認(rèn)內(nèi)置注冊(cè),這也就是我們不再需要在
17、配置文件中定義那么多bean的原因。同時(shí),過濾器順序在使用命名空間的時(shí)候是被嚴(yán)格執(zhí)行的。它們?cè)诔跏蓟臅r(shí)候就預(yù)先被排好序。不僅如此,Spring Security規(guī)定,你不能替換那些元素自己使用而創(chuàng)建出的過濾器,比如HttpSessionContextIntegrationFilter, ExceptionTranslationFilter 或 FilterSecurityInterceptor。 當(dāng)然,這樣的規(guī)定是否合理,有待進(jìn)一步討論。因?yàn)閷?shí)際上在很多時(shí)候,我們希望覆蓋過濾器鏈中的某個(gè)過濾器的默認(rèn)行為。而Spring Security的這種規(guī)定在一定程度上限制了我們的行為。 不過Sprin
18、g Security允許你把你自己的過濾器添加到隊(duì)列中,使用custom-filter元素,并且指定你的過濾器應(yīng)該出現(xiàn)的位置: Xml代碼 不僅如此,你還可以使用after或before屬性,如果你想把你的過濾器添加到隊(duì)列中另一個(gè)過濾器的前面或后面。 再者你還可以分別在position屬性使用FIRST或LAST來指定你的過濾器出現(xiàn)在隊(duì)列元素的前面或后面。這個(gè)特性或許能夠在一定程度上彌補(bǔ)Spring Security的死板規(guī)定,而在之后的應(yīng)用中,我也會(huì)把它作為切入點(diǎn),對(duì)資源進(jìn)行管理。 另外,我需要補(bǔ)充一點(diǎn)的是,對(duì)于在http/intercept-url中沒有進(jìn)行定義的URL,將會(huì)默認(rèn)使用系統(tǒng)內(nèi)
19、置的過濾器鏈進(jìn)行權(quán)限認(rèn)證。所以,你并不需要在http/intercept-url中額外定義一個(gè)類似/*的匹配規(guī)則。采用數(shù)據(jù)庫進(jìn)行身份驗(yàn)證以及資源認(rèn)證把用戶信息和權(quán)限信息放到了xml文件中,這是為了演示如何使用最小的配置就可以使用Spring Security,而實(shí)際開發(fā)中,用戶信息和權(quán)限信息通常是被保存在數(shù)據(jù)庫中的,為此Spring Security提供了通過數(shù)據(jù)庫獲得用戶權(quán)限信息的方式。 通過擴(kuò)展Spring Security的默認(rèn)實(shí)現(xiàn)來進(jìn)行用戶和權(quán)限的管理 事實(shí)上,Spring Security提供了2個(gè)認(rèn)證的接口,分別用于模擬用戶和權(quán)限,以及讀取用戶和權(quán)限的操作方法。這兩個(gè)接口分別是:U
20、serDetails和UserDetailsService。 Java代碼 public interface UserDetails extends Serializable GrantedAuthority getAuthorities(); String getPassword(); String getUsername(); boolean isAccountNonExpired(); boolean isAccountNonLocked(); boolean isCredentialsNonExpired(); boolean isEnabled(); Java代碼 public in
21、terface UserDetailsService UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException; 非常清楚,一個(gè)接口用于模擬用戶,另外一個(gè)用于模擬讀取用戶的過程。所以我們可以通過實(shí)現(xiàn)這兩個(gè)接口,來完成使用數(shù)據(jù)庫對(duì)用戶和權(quán)限進(jìn)行管理的需求。 public class UserDetailsSerivceImpl implements UserDetailsService UserDetails details = null;public
22、 UserDetails loadUserByUsername(String username)throws UsernameNotFoundException, DataAccessException if (username.equals(admin) details = new User(admin, 111, true,new GrantedAuthority new GrantedAuthorityImpl(ROLE_ADMIN); else if (username.equals(user) details = new User(user, 222, true,new Grante
23、dAuthority new GrantedAuthorityImpl(ROLE_USER) );return details;使用數(shù)據(jù)庫對(duì)資源進(jìn)行管理import java.util.ArrayList;import java.util.LinkedHashMap;import java.util.List;import org.springframework.beans.factory.FactoryBean;import org.springframework.security.ConfigAttribute;import org.springframework.security.Con
24、figAttributeDefinition;import org.springframework.security.SecurityConfig;import ercept.web.RequestKey;public class RequestMapFactoryBean implements FactoryBean private LinkedHashMap requestMap;public void init() requestMap = new LinkedHashMap();ConfigAttribute attribute = null;List roleList = null;RequestKey key = null;ConfigAttributeDefinition definition=null;key = new RequestKey(/page/welcome.jsp);roleList = new ArrayList();roleList.add(new SecurityConfig(ROLE_USER);roleList.add(new SecurityConfig(ROLE_ADMIN);definition = new ConfigA
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 教育機(jī)構(gòu)二零二五年度兼職教師聘用含知識(shí)產(chǎn)權(quán)保護(hù)合同
- 二零二五年度智慧城市項(xiàng)目經(jīng)理職位聘用合同
- 語文文學(xué)鑒賞能力考核題
- 新能源汽車充電樁網(wǎng)絡(luò)規(guī)劃方案書
- 新興消費(fèi)市場(chǎng)消費(fèi)者行為分析與營銷策略研究
- 企業(yè)績效評(píng)估咨詢服務(wù)協(xié)議
- 農(nóng)村資源環(huán)境保護(hù)及修復(fù)協(xié)議書
- 農(nóng)業(yè)市場(chǎng)推廣策略實(shí)戰(zhàn)案例分析
- 社區(qū)團(tuán)購電商平臺(tái)合作合同
- 農(nóng)業(yè)合作組織規(guī)范化管理手冊(cè)
- 2024版《中醫(yī)基礎(chǔ)理論經(jīng)絡(luò)》課件完整版
- 期權(quán)入門基礎(chǔ)知識(shí)單選題100道及答案解析
- 2024光伏發(fā)電施工工程機(jī)械設(shè)備安全技術(shù)操作規(guī)程
- 中國華電校園招聘在線測(cè)評(píng)題
- 中建企業(yè)建筑工程項(xiàng)目管理目標(biāo)責(zé)任書(范本)
- 三年級(jí)全一冊(cè)《勞動(dòng)與技術(shù)》第二單元 活動(dòng)1《包書皮》課件
- 2024-2025學(xué)年湖南省長沙市雅禮教育集團(tuán)八年級(jí)(上)創(chuàng)新素養(yǎng)數(shù)學(xué)試卷(含答案)
- 中醫(yī)藥膳專題講座培訓(xùn)課件
- 2022版義務(wù)教育藝術(shù)課程標(biāo)準(zhǔn)美術(shù)新課標(biāo)學(xué)習(xí)解讀課件
- 辦公樓建筑結(jié)構(gòu)設(shè)計(jì)(畢業(yè)設(shè)計(jì))
- 軸對(duì)稱圖形(課件)-2023-2024學(xué)年二年級(jí)下冊(cè)數(shù)學(xué)人教版-1
評(píng)論
0/150
提交評(píng)論