Spring Security研究(1)

 

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 接口的一個實例

相關文章
相關標籤/搜索