天天看點

Spring Security 詳細介紹學習一

Spring Security 是什麼?

        Spring Security 為基于 J2EE 企業應用軟體提供了全面安全服務。 特别是使用領先的 J2EE 解決方案-spring 架構開發的企業軟體項目。如果你沒有使用 Spring 開發企業軟體, 我們熱情的推薦你仔細研究一下。熟悉 Spring-尤其是依賴注入原理-将幫助你更快的掌握 Spring Security。 人們使用 Spring Security 有很多種原因, 不過通常吸引他們的是在 J2EE Servlet 規範 或 EJB 規範中找不到典型企業應用場景的解決方案。 提到這些規範,特别要指出的是它們 不能在 WAR 或 EAR 級别進行移植。這樣,如果你更換伺服器環境, 就要,在新的目标環 境進行大量的工作,對你的應用系統進行重新配置安全。 使用 Spring Security 解決了這 些問題,也為你提供了很多有用的,可定制的其他安全特性。 你可能知道,安全包括兩個主要操作, “認證”和“驗證”(或權限控制)。 這就是 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 (RMI) and HttpInvoker (一個 Spring 遠端調用協定) Automatic "remember-me" authentication (這樣你可以設定一段時間,避免在一段時 間内還需要重新驗證) Anonymous authentication (允許任何調用,自動假設一個特定的安全主體) Run-as authentication (這在一個會話内使用不同安全身份的時候是非常有用的) Java Authentication and Authorization Service (JAAS) JEE Container autentication (這樣,你可以繼續使用容器管理認證,如果想的話) Kerberos Java Open Source Single Sign On (JOSSO) * OpenNMS Network Management Platform * AppFuse * AndroMDA * Mule ESB * Direct Web Request (DWR) * Grails * Tapestry * JTrac * Jasypt * Roller * Elastic Plath * Atlassian Crowd * 你自己的認證系統(向下看) (* 是指由第三方提供,檢視我們的整合網頁,獲得最新詳情的連結。) 許多獨立軟體供應商(ISVs, independent software vendors)采用 Spring Security, 是因為它擁有豐富靈活的驗證模型。 這樣,無論終端使用者需要什麼,他們都可以快速內建 到系統中,不用花很多功夫,也不用讓使用者改變運作環境。 如果上述的驗證機制都沒有滿 足你的需要,Spring Security 是一個開放的平台,編寫自己的驗證機制是十分簡單的。 Spring Security 的許多企業使用者需要整合不遵循任何特定安全标準的“遺留”系統,Spring Security 在這類系統上也表現的很好。

有時基本的認證是不夠的。 有時你需要根據在主體和應用互動的方式來應用不同的安全措 施。比如,你可能,為了保護密碼,不被竊聽或受到中間人攻擊,希望確定請求隻通過 HTTPS 到達。 這在防止暴力攻擊保護密碼恢複過程特别有幫助, 或者簡單的,讓人難以複制你的 系統的關鍵字内容。 為了幫助你實作這些目标,Spring Security 完全支援自動“信道安 全”, 整合 jcaptcha 一體化進行人類使用者檢測。 Spring Security 不僅提供認證功能,也提供了完備的授權功能。 在授權方面主要有三個

領域,授權 web 請求,授權被調用方法,授權通路單個對象的執行個體。 為了幫你了解它們之 間的差別,對照考慮授在 Servlet 規範 web 模式安全,EJB 容器管理安全,和檔案系統安 全方面的授權方式。 Spring Security 在所有這些重要領域都提供了完備的能力,我們将 在這份參考指南的後面進行探讨。 

            1.2. 1.2. 1.2. 1.2. 曆史 Spring Security 開始于2003年年底,““spring 的 acegi 安全系統”。 起因是 Spring 開 發者郵件清單中的一個問題,有人提問是否考慮提供一個基于 spring 的安全實作。 在當 時 Spring 的社群相對較小(尤其是和今天的規模比!),其實 Spring 本身是從2003年初 才作為一個 sourceforge 的項目出現的。 對這個問題的回應是,這的确是一個值得研究的 領域,雖然限于時間問題阻礙了對它的繼續研究。 有鑒于此,一個簡單的安全實作建立起來了,但沒有釋出。 幾周之後,spring 社群的其他 成員詢問安全問題,代碼就被提供給了他們。 随後又有人請求,在2004年一月左右,有 20人在使用這些代碼。 另外一些人加入到這些先行者中來,并建議在 sourceforge 上建 立一個項目,項目在2004年3月正式建立起來。 在早期,項目本身沒有自己的認證子產品。 認證過程都是依賴容器管理安全的,而 acegi 則 注重授權。 這在一開始是合适的,但随着越來越多使用者要求提供額外的容器支援,基于容 器認證的限制就顯現出來了。 還有一個有關的問題,向容器的 classpath 中添加新 jar, 常常讓最終使用者感到困惑,又容易出現配置錯誤。 随後 acegi 加入了認證服務。大約一年後,acegi 成為 spring 的官方子項目。 經過了兩 年半在許多生産軟體項目中的活躍使用和數以萬計的改善和社群的貢獻,1.0.0最終版本發 布于2006年5月。 acegi 在2007年年底,正式成為 spring 組合項目,被更名為“Spring Security”。 現在,Spring Security 成為了一個強大而又活躍的開源社群。 在 Spring Security 支援 論壇上有成千上萬的資訊。 有一個積極的核心開發團隊專職開發,一個積極的社群定期共 享更新檔并支援他們的同伴。 

1.3. 1.3. 1.3. 1.3. 發行版本号

了解 spring Security 發行版本号是非常有用的。它可以幫助你判斷更新到新的版本是否 需要花費很大的精力。 我們使用 apache 便攜式運作項目版本指南,可以在以下網址檢視 http://apr.apache.org/versioning.html。 為了友善大家,我們引用頁面上的一段介紹: “版本号是一個包含三個整數的組合:主要版本号.次要版本号.更新檔。 基本思路是主要版本 是不相容的,大規模更新 API。 次要版本号在源代碼和二進制要與老版本保持相容,更新檔 則意味着向前向後的完全相容。”

 1.4. 1.4. 1.4. 1.4. 獲得 Spring Spring Spring Spring Security Security Security Security

你可以通過多種方式獲得 Spring Security。你可以下載下傳打包好的發行包,從 Spring 的網 站 下載下傳頁,下載下傳單獨的 jar(和執行個體 WAR 檔案)從 Maven 中央資源庫(或者SpringSource Maven 資源庫,獲得快照和裡程碑釋出)。 可選的,你可以通過源代碼建立項目。參考項 目網站獲得更多細節。 

1.4.1. 1.4.1. 1.4.1. 1.4.1. 項目子產品 在 Spring Security 3.0中,項目已經分割成單獨的 jar,這更清楚的按照功能進行分割模 塊和第三方依賴。 如果你在使用 Maven 來建構你的項目,你需要把這些子產品添加到你的

pom.xml 中。 即使你沒有使用 Maven,我們也推薦你參考這個 pom.xml 檔案, 來了 解第三方依賴和對應的版本。可選的,一個好辦法是參考執行個體應用中包含的依賴庫。

 1.4.1.1. 1.4.1.1. 1.4.1.1. 1.4.1.1. Core Core Core Core - spring-security-core.jar spring-security-core.jar spring-security-core.jar spring-security-core.jar 包含了核心認證和權限控制類和接口, 運程支援和基本供應 API。使用 Spring Security 所必須的。支援單獨運作的應用, 遠端用戶端,方法(服務層)安全和 JDBC 使用者供應。 包含頂級包: org.springframework.security.core org.springframework.security.access org.springframework.security.authentication org.springframework.security.provisioning org.springframework.security.remoting 

1.4.1.2. 1.4.1.2. 1.4.1.2. 1.4.1.2. Web Web Web Web - spring-security-web.jar spring-security-web.jar spring-security-web.jar spring-security-web.jar 包含過濾器和對應的 web 安全架構代碼。任何需要依賴 servlet API 的。 你将需要它,如 果 你 需 要 Spring Security Web 認 證 服 務 和 基 于 URL 的 權 限 控 制 。 主 包 是 org.springframework.security.web。 

1.4.1.3. 1.4.1.3. 1.4.1.3. 1.4.1.3. Config Config Config Config - spring-security-config.jar spring-security-config.jar spring-security-config.jar spring-security-config.jar

包含安全命名控制解析代碼(是以我們不能直接把它用在你的應用中)。你需要它, 如果使 用 了 Spring Security XML 命 名 控 制 來 進 行 配 置 。 主 包 是 org.springframework.security.config。 

1.4.1.4. 1.4.1.4. 1.4.1.4. 1.4.1.4. LDAP LDAP LDAP LDAP - spring-security-ldap.jar spring-security-ldap.jar spring-security-ldap.jar spring-security-ldap.jar LDAP 認證和實作代碼,如果你需要使用 LDAP 認證或管理 LDAP 使用者實體就是必須的。頂 級包是 org.springframework.security.ldap。 

1.4.1.5. 1.4.1.5. 1.4.1.5. 1.4.1.5. ACL ACL ACL ACL - spring-security-acl.jar spring-security-acl.jar spring-security-acl.jar spring-security-acl.jar 處理領域對象 ACL 實作。用來提供安全給特定的領域對象執行個體,在你的應用中。 頂級包是 org.springframework.security.acls。

 1.4.1.6. 1.4.1.6. 1.4.1.6. 1.4.1.6. CAS CAS CAS CAS - spring-security-cas-client.jar spring-security-cas-client.jar spring-security-cas-client.jar spring-security-cas-client.jar Spring Security 的 CAs 用戶端內建。如果你希望使用 Spring Security web 認證 整合 一個 CAS 單點登入伺服器。頂級包是 org.springframework.security.cas。 

1.4.1.7. 1.4.1.7. 1.4.1.7. 1.4.1.7. OpenID OpenID OpenID OpenID - spring-security-openid.jar spring-security-openid.jar spring-security-openid.jar spring-security-openid.jar OpenID web 認 證 支 持 。 用 來 認 證 用 戶 , 通 過 一 個 外 部 的 OpenID 服 務 。 org.springframework.security.openid。需要 OpenID4Java。

 1.4.2. 1.4.2. 1.4.2. 1.4.2. 獲得源代碼 Spring Security 是一個開源項目,我們大力推薦你從 subversion 獲得源代碼。 這樣你 可以獲得所有的示例,你可以很容易的建立目前最新的項目。 獲得項目的源代碼對調試也 有很大的幫助。 異常堆棧不再是模糊的黑盒問題,你可以直接找到發生問題的那一行,查 找發生了什麼額外難題。 源代碼也是項目的最終文檔,常常是最簡單的方法,找出這些事 情是如何工作的。 要像獲得項目最新的源代碼,使用如下 subversion 指令:

svn checkout http://acegisecurity.svn.sourceforge.net/svnroot/acegisecurity/spring-security/trunk/

你 可 以 獲 得 特 定 版 本 的 源 代 碼 http://acegisecurity.svn.sourceforge.net/svnroot/acegisecurity/spring-security /tags/.

繼續閱讀