SpringSecurity培訓(共38張)_第1頁
SpringSecurity培訓(共38張)_第2頁
SpringSecurity培訓(共38張)_第3頁
SpringSecurity培訓(共38張)_第4頁
SpringSecurity培訓(共38張)_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Spring Security主講:柴炎星2011-03-28流程介紹Spring Security 簡介Spring Security 11種過濾器介紹Spring Security 基本配置Spring Security 總結Spring Security Spring Security 簡介 這里提到的Spring Security也就是被大家廣為熟悉的Acegi Security,2007年底Acegi Security正式成為Spring Portfolio項目,并更名為Spring Security。Spring Security是一個能夠為基于Spring的企業(yè)應用系統(tǒng)提供描述性

2、安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應用上下文中配置的Bean,充分利用了Spring IoC(依賴注入,也稱控制反轉)和AOP(面向切面編程)功能,為應用系統(tǒng)提供聲明式的安全訪問控制功能,減少了為企業(yè)系統(tǒng)安全控制編寫大量重復代碼的工作。 如今的Spring Security已經(jīng)成為Spring Framework下最成熟的安全系統(tǒng),它為我們提供了強大而靈活的企業(yè)級安全服務,如: 認證授權機制 Web資源訪問控制 業(yè)務方法調用訪問控制 領域對象訪問控制Access Control List(ACL) 單點登錄(Central Authentication Servic

3、e) X509認證 信道安全(Channel Security)管理等功能 當保護Web資源時,Spring Security使用Servlet 過濾器來攔截Http請求進行身份驗證并強制安全性,以確保WEB資源被安全的訪問。無論是保護WEB資源還是保護業(yè)務方法或者領域對象,Spring Security都是通過上圖中的組件來完成的。本文主要闡述如何使用Spring Security對WEB應用程序的資源進行安全訪問控制,并通過一個簡單的實例來對Spring Security提供的各種過濾器的功能和配置方法進行描述。 Spring Security 11種過濾器介紹HttpSessionCon

4、textIntegrationFilter位于過濾器頂端,第一個起作用的過濾器。用途一,在執(zhí)行其他過濾器之前,率先判斷用戶的session中是否已經(jīng)存在一個SecurityContext了。如果存在,就把SecurityContext拿出來,放到SecurityContextHolder中,供Spring Security的其他部分使用。如果不存在,就創(chuàng)建一個SecurityContext出來,還是放到SecurityContextHolder中,供Spring Security的其他部分使用。用途二,在所有過濾器執(zhí)行完畢后,清空SecurityContextHolder,因為Security

5、ContextHolder是基于ThreadLocal的,如果在操作完成后清空ThreadLocal,會受到服務器的線程池機制的影響。LogoutFilter只處理注銷請求,默認為/j_spring_security_logout。用途是在用戶發(fā)送注銷請求時,銷毀用戶session,清空SecurityContextHolder,然后重定向到注銷成功頁面??梢耘crememberMe之類的機制結合,在注銷的同時清空用戶cookie。AuthenticationProcessingFilter處理form登陸的過濾器,與form登陸有關的所有操作都是在此進行的。默認情況下只處理/j_spring_

6、security_check請求,這個請求應該是用戶使用form登陸后的提交地址。此過濾器執(zhí)行的基本操作時,通過用戶名和密碼判斷用戶是否有效,如果登錄成功就跳轉到成功頁面(可能是登陸之前訪問的受保護頁面,也可能是默認的成功頁面),如果登錄失敗,就跳轉到失敗頁面。 登陸 用戶: 密碼: 兩周之內不必登陸 /j_spring_security_check,提交登陸信息的URL地址。自定義form時,要把form的action設置為/j_spring_security_check。注意這里要使用絕對路徑,避免登陸頁面存放的頁面可能帶來的問題。 j_username,輸入登陸名的參數(shù)名稱。 j_pas

7、sword,輸入密碼的參數(shù)名稱 _spring_security_remember_me,選擇是否允許自動登錄的參數(shù)名稱??梢灾苯影堰@個參數(shù)設置為一個checkbox,無需設置value,Spring Security會自行判斷它是否被選中。DefaultLoginPageGeneratingFilter此過濾器用來生成一個默認的登錄頁面,默認的訪問地址為/spring_security_login,這個默認的登錄頁面雖然支持用戶輸入用戶名,密碼,也支持rememberMe功能,但是因為太難看了,只能是在演示時做個樣子,不可能直接用在實際項目中。自定義登陸頁面 BasicProcessingF

8、ilterBasicProcessingFilter 此過濾器用于進行basic驗證,功能與AuthenticationProcessingFilter類似,只是驗證的方式不同。添加basic認證,去掉auto-config=true,并加上 SecurityContextHolderAwareRequestFilter 此過濾器用來包裝客戶的請求。目的是在原始請求的基礎上,為后續(xù)程序提供一些額外的數(shù)據(jù)。比如getRemoteUser()時直接返回當前登陸的用戶名之類的。ExceptionTranslationFilter此過濾器的作用是處理中FilterSecurityInterceptor

9、拋出的異常,然后將請求重定向到對應頁面,或返回對應的響應錯誤代碼。RememberMeProcessingFilterRememberMeProcessingFilter 此過濾器實現(xiàn)RememberMe功能,當用戶cookie中存在rememberMe的標記,此過濾器會根據(jù)標記自動實現(xiàn)用戶登陸,并創(chuàng)建SecurityContext,授予對應的權限。在配置文件中使用auto-config=true就會自動啟用rememberMe實際上,Spring Security中的rememberMe是依賴cookie實現(xiàn)的,當用戶在登錄時選擇使用rememberMe,系統(tǒng)就會在登錄成功后將為用戶生成一個

10、唯一標識,并將這個標識保存進cookie中,我們可以通過瀏覽器查看用戶電腦中的cookie。AnonymousProcessingFilterAnonymousProcessingFilter 為了保證操作統(tǒng)一性,當用戶沒有登陸時,默認為用戶分配匿名用戶的權限。在配置文件中使用auto-config=true就會啟用匿名登錄功能。在啟用匿名登錄之后,如果我們希望允許未登錄就可以訪問一些資源,可以在進行如下配置。 設置成 ROLE_ANONYMOUS 也可以。 filters=none表示當我們訪問“/”時,是不會使用任何一個過濾器去處理這個請求的,它可以實現(xiàn)無需登錄即可訪問資源的效果,但是因為

11、沒有使用過濾器對請求進行處理,所以也無法利用安全過濾器為我們帶來的好處,最簡單的,這時SecurityContext內再沒有保存任何一個權限主體了,我們也無法從中取得主體名稱以及對應的權限信息。ExceptionTranslationFilterExceptionTranslationFilter 此過濾器的作用是處理中FilterSecurityInterceptor拋出的異常,然后將請求重定向到對應頁面,或返回對應的響應錯誤代碼。SessionFixationProtectionFilterSessionFixationProtectionFilter 防御會話偽造攻擊。解決session

12、 fix的問題其實很簡單,只要在用戶登錄成功之后,銷毀用戶的當前session,并重新生成一個session就可以了。 session-fixation-protection的值共有三個可供選擇,none,migrateSession和newSession。默認使用的是migrationSessionFilterSecurityInterceptor用戶的權限控制都包含在這個過濾器中。功能一:如果用戶尚未登陸,則拋出AuthenticationCredentialsNotFoundException“尚未認證異?!薄9δ芏喝绻脩粢训卿?,但是沒有訪問當前資源的權限,則拋出AccessDeni

13、edException“拒絕訪問異常”。功能三:如果用戶已登錄,也具有訪問當前資源的權限,則放行。至此,我們完全展示了默認情況下Spring Security中使用到的過濾器,以及每個過濾器的應用場景和顯示功能,下面我們會對這些過濾器的配置和用法進行逐一介紹。Spring Security 基本配置最小化配置 1. 在web.xml文件中加入Filter聲明 Xml代碼 springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain /* 這個Fil

14、ter會攔截所有的URL請求,并且對這些URL請求進行Spring Security的驗證。 注意,springSecurityFilterChain這個名稱是由命名空間默認創(chuàng)建的用于處理web安全的一個內部的bean的id。所以你在你的Spring配置文件中,不應該再使用這個id作為你的bean。 2. 使用最小的配置 Xml代碼 這段配置表示:1:只有擁有ROLE_ADMIN角色的用戶才可以訪問/admin.jsp。2:擁有ROLE_USER角色的用戶,可以訪問應用程序中的所有URL。你可以使用多個元素為不同URL的集合定義不同的訪問需求,它們會被歸入一個有序隊列中,每次取出最先匹配的一個

15、元素使用。 所以你必須把期望使用的匹配條件放到最上邊。 自定義登錄頁面 讓沒登陸的用戶也可以訪問login.jsp。這是因為配置文件中的“/*”配置,要求用戶訪問任意一個系統(tǒng)資源時,必須擁有ROLE_USER角色,/login.jsp也不例外,如果我們不為/login.jsp單獨配置訪問權限,會造成用戶連登陸的權限都沒有,這是不正確的。 login-page表示用戶登陸時顯示我們自定義的login.jsp。這時我們訪問系統(tǒng)顯示的登陸頁面將是我們上面創(chuàng)建的login.jsp。 authentication-failure-url表示用戶登陸失敗時,跳轉到哪個頁面。當用戶輸入的登錄名和密碼不正確時

16、,系統(tǒng)將再次跳轉到/login.jsp,并添加一個error=true參數(shù)作為登陸失敗的標示。 default-target-url表示登陸成功時,跳轉到哪個頁面剖析基本配置元素 1. 有關auto-config屬性 在上面用到的auto-config屬性,其實是下面這些配置的縮寫: Xml代碼 這些元素分別與登錄認證,匿名認證,基本認證,注銷處理和remember-me對應。 他們擁有各自的屬性,可以改變他們的具體行為。 這樣,我們在Acegi中所熟悉的元素又浮現(xiàn)在我們的面前(備注)。只是在這里,我們使用的是命名空間而已。 這些過濾器已經(jīng)被Spring容器默認內置注冊,這也就是我們不再需要在

17、配置文件中定義那么多bean的原因。同時,過濾器順序在使用命名空間的時候是被嚴格執(zhí)行的。它們在初始化的時候就預先被排好序。不僅如此,Spring Security規(guī)定,你不能替換那些元素自己使用而創(chuàng)建出的過濾器,比如HttpSessionContextIntegrationFilter, ExceptionTranslationFilter 或 FilterSecurityInterceptor。 當然,這樣的規(guī)定是否合理,有待進一步討論。因為實際上在很多時候,我們希望覆蓋過濾器鏈中的某個過濾器的默認行為。而Spring Security的這種規(guī)定在一定程度上限制了我們的行為。 不過Sprin

18、g Security允許你把你自己的過濾器添加到隊列中,使用custom-filter元素,并且指定你的過濾器應該出現(xiàn)的位置: Xml代碼 不僅如此,你還可以使用after或before屬性,如果你想把你的過濾器添加到隊列中另一個過濾器的前面或后面。 再者你還可以分別在position屬性使用FIRST或LAST來指定你的過濾器出現(xiàn)在隊列元素的前面或后面。這個特性或許能夠在一定程度上彌補Spring Security的死板規(guī)定,而在之后的應用中,我也會把它作為切入點,對資源進行管理。 另外,我需要補充一點的是,對于在http/intercept-url中沒有進行定義的URL,將會默認使用系統(tǒng)內

19、置的過濾器鏈進行權限認證。所以,你并不需要在http/intercept-url中額外定義一個類似/*的匹配規(guī)則。采用數(shù)據(jù)庫進行身份驗證以及資源認證把用戶信息和權限信息放到了xml文件中,這是為了演示如何使用最小的配置就可以使用Spring Security,而實際開發(fā)中,用戶信息和權限信息通常是被保存在數(shù)據(jù)庫中的,為此Spring Security提供了通過數(shù)據(jù)庫獲得用戶權限信息的方式。 通過擴展Spring Security的默認實現(xiàn)來進行用戶和權限的管理 事實上,Spring Security提供了2個認證的接口,分別用于模擬用戶和權限,以及讀取用戶和權限的操作方法。這兩個接口分別是: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; 非常清楚,一個接口用于模擬用戶,另外一個用于模擬讀取用戶的過程。所以我們可以通過實現(xiàn)這兩個接口,來完成使用數(shù)據(jù)庫對用戶和權限進行管理的需求。 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ù)庫對資源進行管理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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論