springsecurity

安全服務體系

Spring Security是一個能夠為基於Spring的企業應用系統提供聲明式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反轉Inversion of Control ,DI:Dependency Injection 依賴注入)和AOP(面向切面編程)功能,為應用系統提供聲明式的安全訪問控制功能,減少了為企業系統安全控制編寫大量重複代碼的工作。

簡介


Spring Security 的前身是 Acegi Security ,是 Spring 項目組中用來提供安全認證服務的框架。
Spring Security 為基於J2EE企業應用軟體提供了全面安全服務。特別是使用領先的J2EE解決方案-Spring框架開發的企業軟體項目。

功能


Spring Security對Web安全性的支持大量地依賴於Servlet過濾器。這些過濾器攔截進入請求,並且在應用程序處理該請求之前進行某些安全處理。 Spring Security提供有若干個過濾器,它們能夠攔截Servlet請求,並將這些請求轉給認證和訪問決策管理器處理,從而增強安全性。根據自己的需要,可以使用適當的過濾器來保護自己的應用程序。
如果使用過Servlet過濾器且令其正常工作,就必須在Web應用程序的web.xml文件中使用元素配置它們。雖然這樣做能起作用,但是它並不適用於使用依賴注入進行的配置。
FilterToBeanProxy是一個特殊的Servlet過濾器,它本身做的工作並不多,而是將自己的工作委託給Spring應用程序上下文 中的一個Bean來完成。被委託的Bean幾乎和其他的Servlet過濾器一樣,實現javax.servlet.Filter接 口,但它是在Spring配置文件而不是web.xml文件中配置的。
實際上,FilterToBeanProxy代理給的那個Bean可以是javax.servlet.Filter的任意實現。這可以是 Spring Security的任何一個過濾器,或者它可以是自己創建的一個過濾器。但是正如本書已經提到的那樣,Spring Security要求至少配置四個而且可能一打或者更多的過濾器。

優點


人們使用Spring Security有很多種原因,不過通常吸引他們的是在J2EE Servlet規範或EJB規範中找不到典型企業應用場景的解決方案。
特別要指出的是他們不能在WAR 或EAR 級別進行移植。
這樣,如果更換伺服器環境,就要,在新的目標環境進行大量的工作,對應用系統進行重新配置安全。
使用Spring Security 解決了這些問題,也提供很多有用的,完全可以指定的其他安全特性。
可能知道,安全包括兩個主要操作。
第一個被稱為“認證”,是為用戶建立一個他所聲明的主體。主體一般是指用戶,設備或可以在系統中執行動作的其他系統。
第二個叫“授權”,指的是一個用戶能否在應用中執行某個操作,在到達授權判斷之前,身份的主體已經由身份驗證過程建立。
這些概念是通用的,不是Spring Security特有的。
在身份驗證層面,Spring Security廣泛支持各種身份驗證模式,這些驗證模型絕大多數都由第三方提供,或者正在開發的有關標準機構提供的,例如 Internet Engineering Task Force.
作為補充,Spring Security 也提供了自己的一套驗證功能。
Spring Security 目前支持認證一體化如下認證技術:
HTTP BASIC authentication headers (一個基於IEFT RFC 的標準)
HTTP Digest authentication headers (一個基於IEFT RFC 的標準)
HTTP X.509 client certificate exchange (一個基於IEFT RFC 的標準)
LDAP (一個非常常見的跨平台認證需要做法,特別是在大環境)
Form-based authentication (提供簡單用戶介面的需求)
OpenID authentication
Computer Associates Siteminder
JA-SIG Central Authentication Service (CAS,這是一個流行的開源單點登錄系統)
Transparent authentication context propagation for Remote Method Invocation and HttpInvoker (一個Spring遠程調用協議)

使用技巧


部署“Tutorial”樣常式序
這個樣常式序包含在spring發布的zip壓縮包文件,名為:spring-security-samples-tutorial-.war。把這個文件重命名為tutorial.war(以便於部署到tomcat時簡化訪問的URL鏈接)。把這個文件放到tomcat下的webapp目錄下,然後啟動tomcat服務。之後就可以用鏈接訪問這個應用程序了。這個樣常式序沒有做太多的事,不過的確提供了一個很好的模板能很好的把spring安全集成到項目中。絕大多數初學者在這個過程中常遇到的問題出現在簡單的配置錯誤或者路徑錯誤(或者WEB-inf/lib目錄下缺失jar包)。必須在一個可以運行的配置環境的基礎上開始構建項目。
當運行程序的時候,確保自己熟悉spring安全的調試日誌輸出(日誌輸出默認為打開狀態)。雖然框架輸出詳細的日誌,但是很多人卻使用得很失敗。作為一個未授權的用戶點擊了一個安全的鏈接,當登錄,退出等等情況下的時候到底發生了什麼?當進入到安全過濾器鏈開始處理的時候,將會看到每一個http請求及如何處理的日誌,所以許多在論壇中報道的問題可以按網頁瀏覽器請求的相應日誌記錄來匹配查找得以解決
在命名空間第一章節的第一部分,絕大部分是關於之前學習過的兩個步驟,進入前面使用過指南樣例(tutorial sample)命令空間元素並且理解它們的主要目的。如果有修改過Petclinic tutorial或者其它的樣常式序,參考嚮導(Reference Guide)的其它部分將帶進入更詳細的有關於框架實現類,如果有需要的話,可以瀏覽下它們。
部署通訊錄(Contacts)樣例(可選)
這個樣例將嘗試更多spring安全框架高級屬性,尤其是ACL模塊。文件spring-security-samples-contacts-.war是標準的webMVC應用程序,它可以讓以特殊的用戶(列舉在登錄頁面的用戶)登錄並且查看資料庫中的”通訊錄”,每個登錄用戶都有若干許可權列表,如何登錄用戶有必需的許可權的就可以查看若干的通訊錄列表。有某個通訊錄管理許可權的用戶就可以刪除這個通訊錄,創建或者刪除其中實例的許可權,因此可以分配(重分配)其它用戶讀,寫,管理通訊錄中實例的許可權。Spring安全應用在方法級通過在介面ContactManager使用註釋(annotations)配置來引入的。
保障應用程序安全
到這個步驟應該對spring的安全如果發覺功效有了很好的領會,剩下的工作應該是如果設計應用程序來實現安全了。推薦使用指南樣例(Tutorial Sample)來完成實際的集成工作,即使有複雜的需求。大多數在論壇中報告問題的都是出自配置的問題,因為他們在一開始在並不知道將要如果進行的時候做了太多的改變。

版本發布


2010年12月22日,Spring Security 3.1.0.M2 發布。
2011年02月12日,Spring Security 3.1.0.RC1 發布,與 M2 版本比較,該版本主要改進內容請看 changelog 。
2011年05月01日,Spring Security 3.1.0.RC2 發布。
2011年12月08日,Spring Security 3.1.0 GA版 發布,改進:
新特性:添加支持bcrypt密碼編碼,允許使用一個顯式定義一個過濾器鏈RequestMatcher當使用名稱空間,允許使用定製AuthenticationManager在< http >和全球方法安全性。
在文檔中添加“改進點”章節
AbstractAuthenticationProcessingFilter 介面應當包含AuthenticationFailureHandler 和 AuthenticationSuccessHandler的getter方法
在命名空間文檔中刪除自動配置
方便在多個服務中創建DefaultSpringSecurityContextSource
OpenID的默認文本輸入框太小了
認證的管理不能被重寫
DelegatingMethodSecurityMetadataSource中包含有過多的(誤導性)的日誌
提醒用戶use-secure-cookie設置為false並不能真正的阻止cookie被標記為安全
在命名空間的解析代碼中移除了過時的方法
模型中的ID類型不利於使用Spring 3.1的概要文件。
改進命名空間的文檔。
2014年8月19日,Spring Security 4.0.0.M2 發布。
主要改進內容:
• Support for WebSocket Security using Spring's messaging abstraction
• Spring Data integration
• Spring Session was produced out of the work necessary for this release. In an application server independent way you can easily use a custom backend (i.e. Redis) as the HttpSession implementation. See the project page for additional features of this exciting new project.
• Enhancements and fixes to the testing support
• Easier integration with MockMvc through SecurityMockMvcConfigurers
• You no longer need to specify WithSecurityContextTestExecutionListener on your tests
• @WithSecurityContext works even with custom SecurityContextRepository implementations
• Support for digest and certificate based authentication testing
• Support nested static groups in LDAP Authentication
• Lots of integration tests added to the sample applications
• Updated minimum version of Spring 4.1 RC2. This was necessary for enough of the features, that it made sense to do across the board
更多內容請看發行日誌。