網上的一篇spring security詳解教程,以爲不錯,轉過來了

先來談一談Acegi的基礎知識,Acegi的架構比較複雜,可是我但願我下面的隻言片語可以把它說清楚。你們都知道,若是要對Web資源進行保護,最好的辦法莫過於Filter,要想對方法調用進行保護,最好的辦法莫過於AOPAcegiWeb資源的保護,就是靠Filter實現的。以下圖: 
查看更多精彩圖片
通常來講,咱們的Filter都是配置在web.xml中,可是Acegi不同,它在web.xml中配置的只是一個代理,而真正起做用的Filter是做爲Bean配置在Spring中的。web.xml中的代理依次調用這些Bean,就實現了對Web資源的保護,同時這些Filter做爲BeanSpring管理,因此實現AOP也很簡單,真的是一箭雙鵰啊。 

Acegi
中提供的Filter很多,有十多個,一個一個學起來比較複雜。可是對於咱們Web開發者來講,經常使用的就那麼幾個,以下圖中的被紅圈圈標記出來的: 

查看更多精彩圖片
從上到下,它們實現的功能依次是1、制定必須爲https鏈接;2、從Session中提取用戶的認證信息;3、退出登陸;4、登陸;5、記住用戶;6、全部的應用必須配置這個Filter 

通常來講,咱們寫Web應用只須要熟悉這幾個Filter就能夠了,若是不須要https鏈接,連第一個也不用熟悉。可是有人確定會想,這些Filter怎麼和個人數據庫聯繫起來呢?不用着急,這些Filter並不直接處理用戶的認證,也不直接處理用戶的受權,而是把它們交給了認證管理器和決策管理器。以下圖: 
查看更多精彩圖片

對於這兩種管理器,那也是不須要咱們寫代碼的,Acegi也提供了現成的類。那麼你們又奇怪了:又是現成的,那怎麼和個人數據庫關聯起來呢?彆着急,其實這兩個管理器本身也不作事,認證管理器把任務交給了Provider,而決策管理器則把任務交給了Voter,以下圖: 

查看更多精彩圖片
如今我要告訴大家,這裏的ProviderVoter也是不須要咱們寫代碼的。不要崩潰,快到目標了。Acegi提供了多個Provider的實現類,若是咱們想用數據庫來儲存用戶的認證數據,那麼咱們就選擇DaoAuthenticationProvider。對於Voter,咱們通常選擇RoleVoter就夠用了,它會根據咱們配置文件中的設置來決定是否容許某一個用戶訪問制定的Web資源。 

DaoAuthenticationProvider也是不直接操做數據庫的,它把任務委託給了UserDetailService,以下圖: 

查看更多精彩圖片
html

 

 

插入一些相關教程 web

 

2) httpSessionContextIntegrationFilter
  每次request前 HttpSessionContextIntegrationFilter從Session中獲取Authentication對象,在request完後, 又把Authentication對象保存到Session中供下次request使用,此filter必須其餘Acegi filter前使用,使之能跨越多個請求。 數據庫

<bean id="httpSessionContextIntegrationFilter" 瀏覽器

        class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"> cookie

    </bean> 架構

 

3) basicProcessingFilter 
  用於處理HTTP頭的認證信息,如從Spring遠程協議(如Hessian和Burlap)或普通的瀏覽器如IE,Navigator的HTTP頭中獲取用戶信息,將他們轉交給經過authenticationManager屬性裝配的認證管理器。若是認證成功,會將一個Authentication對象放到會話中,不然,若是認證失敗,會將控制轉交給認證入口點(經過authenticationEntryPoint屬性裝配) ide

<bean id="basicProcessingFilter" class="org.acegisecurity.ui.basicauth.BasicProcessingFilter"> 單元測試

        <property name="authenticationManager" ref="authenticationManager" /> 測試

        <property name="authenticationEntryPoint" ref="basicProcessingFilterEntryPoint" /> ui

    </bean>

 

4) basicProcessingFilterEntryPoint 
  經過向瀏覽器發送一個HTTP401(未受權)消息,提示用戶登陸。
處理基於HTTP的受權過程, 在當驗證過程出現異常後的"去向",一般實現轉向、在response里加入error信息等功能。

<bean id="basicProcessingFilterEntryPoint"

        class="org.acegisecurity.ui.basicauth.BasicProcessingFilterEntryPoint">

        <property name="realmName" value="Acegi First Realm Name" />

    </bean>

    其中,realmName屬性取值並不存在太多的實際含義,運行時,」Acegi First Realm Name「字符串會顯示在IE瀏覽器彈出的HTTP BASIC認證對話框中。

 

5) exceptionTranslationFilter
  異常轉換過濾器,主要是處理AccessDeniedException和AuthenticationException,將給每一個異常找到合適的"去向" 

<bean id="exceptionTranslationFilter"

        class="org.acegisecurity.ui.ExceptionTranslationFilter">

        <property name="authenticationEntryPoint" ref="basicProcessingFilterEntryPoint" />

    </bean>

在此,若是認證不經過將會將控制轉交給認證入口點(經過authenticationEntryPoint屬性裝配)

6) authenticationManager
  起到認證管理的做用,它將驗證的功能委託給多個Provider,並經過遍歷Providers, 以保證獲取不一樣來源的身份認證,若某個Provider能成功確認當前用戶的身份,authenticate()方法會返回一個完整的包含用戶受權信息的Authentication對象,不然會拋出一個AuthenticationException。
Acegi提供了不一樣的AuthenticationProvider的實現,如:
        DaoAuthenticationProvider 從數據庫中讀取用戶信息驗證身份
        AnonymousAuthenticationProvider 匿名用戶身份認證
        RememberMeAuthenticationProvider 已存cookie中的用戶信息身份認證
        AuthByAdapterProvider 使用容器的適配器驗證身份
        CasAuthenticationProvider 根據Yale中心認證服務驗證身份, 用於實現單點登錄
        JaasAuthenticationProvider 從JASS登錄配置中獲取用戶信息驗證身份
        RemoteAuthenticationProvider 根據遠程服務驗證用戶身份
        RunAsImplAuthenticationProvider 對身份已被管理器替換的用戶進行驗證
        X509AuthenticationProvider 從X509認證中獲取用戶信息驗證身份
        TestingAuthenticationProvider 單元測試時使用

        每一個認證者會對本身指定的證實信息進行認證,如DaoAuthenticationProvider僅對UsernamePasswordAuthenticationToken這個證實信息進行認證。

<bean id="authenticationManager"

        class="org.acegisecurity.providers.ProviderManager">

        <property name="providers">

            <list>

                <ref local="daoAuthenticationProvider" />

            </list>

        </property>

    </bean>

相關文章
相關標籤/搜索