1, 獲取Spring Security的Jar包 :從Spring網站下載頁下載或者從Maven中央倉庫下載。一個好辦法是參考實例應用中包含的依賴庫。css
2,項目模塊:web
Core - spring-security-core.jar
包含了核心認證和權限控制類和接口, 運程支持和基本供應 API。使用 Spring Security 所必須的。支持單獨運行的應用, 遠程客戶端,方法(服務層)安全和 JDBC用戶供應。
Web - spring-security-web.jar
包含過濾器和對應的 web 安全架構代碼。任何須要依賴 servlet API 的。 你將須要它,若是你須要 Spring Security Web 認證服務和基於 URL 的權限控制。
Config - spring-security-config.jar
包含安全命名控制解析代碼(所以咱們不能直接把它用在你的應用中)。你須要它,若是使用了 Spring Security XML 命名控制來進行配置。
LDAP - spring-security-ldap.jar
LDAP 認證和實現代碼,若是你須要使用 LDAP 認證或管理 LDAP 用戶實體就是必須的。
ACL - spring-security-acl.jar
處理領域對象 ACL 實現。用來提供安全給特定的領域對象實例,在你的應用中。
CAS - spring-security-cas-client.jar
Spring Security 的 CAs 客戶端集成。若是你但願使用 Spring Security web 認證整合一個 CAS 單點登陸服務器。
OpenID - spring-security-openid.jar
OpenID web 認證 支持 。 用來 認證 用戶 ,通 過 一個 外部 的 OpenID 服務。算法
3, 獲取項目源代碼spring
svn checkout http://acegisecurity.svn.sourceforge.net/svnroot/acegisecurity/spring-security/trunk/數據庫
4,添加 security 命名空間安全
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"></beans>
你會看到(在示例中)應用,咱們一般使用"security"做爲默認的命名空間,而不是"beans",這意味着咱們能夠省略全部 security 命名空間元素的前綴,使上下文更容易閱讀。 若是你把應用上下文分割成單獨的文件,讓你的安全配置都放到其中一個文件裏,這樣更容易使用這種配置方法。服務器
<b:beans xmlns="http://www.springframework.org/schema/security" xmlns:b="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">
5,開始使用安全命名空間配置架構
1) 配置 web.xmlapp
<filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
這是爲 Spring Security 的 web 機制提供了一個調用鉤子。這種狀況下 , bean 的名字是"springSecurityFilterChain",這是由命名空間建立的用於處理 web 安全的一個內部的機制。 注意,你不該該本身使用這個 bean 的名字。jsp
2)編輯 applicationContext 文件 web 安全服務 是使用<http>元素配置的。 最小 <http>配置:
<http auto-config='true'> <intercept-url pattern="/**" access="ROLE_USER" /> </http>
這表示,咱們要保護應用程序中的全部 URL,只有擁有 ROLE_USER 角色的用戶才能訪問。
<intercept-url>元素定義了 pattern,用來匹配進入的請求 URL,使用一個 ant 路徑語法
access 屬性定義了請求匹配了指定模式時的需求。使用默認的配置, 這個通常是一個逗號分隔的角色隊列,一個用戶中的一個必須被容許訪問請求
前綴「ROLE_」表示的是一個用戶應該擁有的權限比對。
Spring Security 中的訪問控制不限於簡單角色的應用(所以,咱們使用不一樣的前綴來區分不一樣的安全屬性)
Note:
你可使用多個<intercept-url>元素爲不一樣 URL 的集合定義不一樣的訪問需求,它們會被納入一個有序隊列中,每次取出最早匹配的一個元素使用。 因此你必須把指望使用的匹配條件放到最上邊。你也能夠添加一個 method 屬性 來限制匹配一個特定的HTTP method(GET, POST, PUT 等等)。對於一個模式同時定義在定義了 method 和未定義 method 的狀況,指定method 的匹配會無視順序優先被使用。
咱們在上面用到的 auto-config 屬性,實際上是下面這些配置的縮寫: <http> <form-login /> <http-basic /> <logout /> </http>
<!-- 直接定義一些測試數據--> <authentication-manager> <!-- <authentication-provider>元素意味着用戶信息將被認證管理用做處理認證請求。 你能夠擁有多個<authentication-provider>元素來定義不一樣的認證數據 --> <authentication-provider> <user-service> <!-- 能夠從標準的properties文件中讀取這些信息--> <user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" /> <user name="bob" password="bobspassword" authorities="ROLE_USER" /> </user-service> </authentication-provider> </authentication-manager>
6, 表單和基本登陸選項
若是你想實現本身的登陸頁面,你可使用
<http auto-config='true'> <intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/> <intercept-url pattern="/**" access="ROLE_USER" /> <form-login login-page='/login.jsp'/> </http>
依舊可使用 auto-config。 這個 form-login 元素會覆蓋默認的設置
咱們須要添加額外的 intercept-url 元素,指定用來作登陸的頁面的 URL,這些 URL 應該能夠被匿名訪問。不然,這些請求會被/**部分攔截,它無法訪問到登陸頁面
若是你的登陸頁面是被保護的。 也可能讓全部的請求都匹配特定的模式,經過徹底的安全過濾器鏈:
<http auto-config='true'> <intercept-url pattern="/css/**" filters="none"/> <intercept-url pattern="/login.jsp*" filters="none"/> <intercept-url pattern="/**" access="ROLE_USER" /> <form-login login-page='/login.jsp'/> </http>
若是你但願使用基本認證,代替表單登陸,能夠把配置改成:
<http auto-config='true'> <intercept-url pattern="/**" access="ROLE_USER" /> <http-basic /> </http>
基自己份認證會被優先用到,在用戶嘗試訪問一個受保護的資源時,用來提示用戶登陸。在這種配置中,表單登陸依然是可用的
設置一個默認的提交登錄目標
若是在進行表單登錄以前,沒有試圖去訪問一個被保護的資源,default-target-url就會起做用。 這是用戶登錄後會跳轉到的 URL ,默認是 "/" 。你也能夠把always-use-default-target 屬性配置成"true",這樣用戶就會一直跳轉到這一頁(無論登錄是「跳轉過來的」仍是用戶特定進行登錄)。 若是你的系統一直須要用戶從首頁進入,就可使用它了,好比:
<http> <intercept-url pattern='/login.htm*' filters='none'/> <intercept-url pattern='/**' access='ROLE_USER' /> <form-login login-page='/login.htm' default-target url='/home.htm' always-use-default-target='true' /> </http>
7, 使用其餘認證提供器
多數狀況下,你會想把用戶信息保存到數據庫或者是 LDAP 服務器裏
若是你自定義了一個 Spring Security 的 UserDetailsService 實現,在你的 application context 中名叫"myUserDetailsService",而後你可使用下面的驗證。
<authentication-manager> <authentication-provider user-service-ref='myUserDetailsService'/> </authentication-manager>
若是你想用數據庫,可使用下面的方式
<authentication-manager> <authentication-provider> <jdbc-user-service data-source-ref="securityDataSource"/> </authentication-provider> </authentication-manager>
這裏的「securityDataSource」就是 DataSource bean 在 application context 裏的名字,它指向了包含着 Spring Security 用戶信息的表。
另外,你能夠配置一個 Spring Security JdbcDaoImpl bean,使用 user-service-ref 屬性指定:
<authentication-manager> <authentication-provider user-service-ref='myUserDetailsService'/> </authentication-manager> <beans:bean id="myUserDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl"> <beans:property name="dataSource" ref="dataSource"/>
8,添加一個密碼編碼器
你的密碼數據一般要使用一種散列算法進行編碼。 使用<password-encoder>元素支持這個功能。 使用 SHA 加密密碼,原始的認證供應器配置
<authentication-manager> <authentication-provider> <password-encoder hash="sha"/> <user-service> <user name="jimi" password="d7e6351eaa13189a5a3641bab846c8e8c69ba39f" authorities="ROLE_USER, ROLE_ADMIN" /> <user name="bob" password="4e7421b1b8765d8f9406d87e7cc6aa784c4ab97f" authorities="ROLE_USER" /> </user-service> </authentication-provider> </authentication-manager>
在使用散列密碼時,用鹽值防止字典攻擊是個好主意,Spring Security 也支持這個功能。 理想狀況下,你可能想爲每一個用戶隨機生成一個鹽值,不過,你可使用從UserDetailsService 讀取出來的 UserDetails 對象中的屬性。好比,使用 username屬性,你能夠這樣用:
<password-encoder hash="sha"> <salt-source user-property="username"/> </password-encoder>
你能夠經過 password-encoder 的 ref 屬性,指定一個自定義的密碼編碼器 bean。這應該包含 application context 中一個 bean 的名字,它應該是 Spring Security 的PasswordEncoder 接口的一個實例