欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Acegi 應(yīng)用基礎(chǔ)

系統(tǒng) 1612 0

Acegi 是一個(gè)基于 Spring 開發(fā)的安全框架,為應(yīng)用程序提供基于 統(tǒng)一資源定位符 URL 方法訪問 的細(xì)粒度安全控制和保護(hù)功能。 Acegi Security System 使用安全過濾器來提供企業(yè)應(yīng)用程序的身份驗(yàn)證和授權(quán)服務(wù)。 Acegi 的設(shè)計(jì)仍是一個(gè)基于角色的權(quán)限控制系統(tǒng),它通過一系列可配置的組件構(gòu)建了一個(gè)基于 Spring IOC 組件裝配模式的安全框架。在 Acegi 安全框架中也有 Principal ( 通常是用戶名 ) Credentials ( 通常是口令 ) 的概念,不過在 Acegi 框架中,通常將 UserDetails 作為 Principal ,除存儲(chǔ)用戶名外,還包含用戶角色等權(quán)限信息。 Authentication 對(duì)象還能存儲(chǔ)一些與認(rèn)證請(qǐng)求有關(guān)的附加信息, e.g: 用戶 IP 地址。

Acegi 使用 SecurityContext 來存儲(chǔ) Authentication ,默認(rèn)情況下, Acegi 使用 ThreadLocal 來實(shí)現(xiàn) SecurityContext 。在應(yīng)用程序中通過 SecurityContextHolder.getContext().getAuthentication() 來獲取 Authentication 對(duì)象

?

四大組件

Acegi Security System 由四種主要類型的組件組成:過濾器、管理器、提供者和處理程序。

?

1. 過濾器

這種最高級(jí)的組件提供了常見的安全服務(wù),如身份驗(yàn)證、會(huì)話處理以及注銷。


2. 管理器

過濾器僅是安全相關(guān)功能的高級(jí)抽象:實(shí)際上要使用管理器和提供者實(shí)現(xiàn)身份驗(yàn)證處理和注銷服務(wù)。管理器管理由不同提供者提供的較低級(jí)的安全服務(wù)。


3. 提供者

有大量的提供者可用于和不同類型的數(shù)據(jù)存儲(chǔ)服務(wù)通信,例如目錄服務(wù)、關(guān)系數(shù)據(jù)庫或簡單的內(nèi)存中的對(duì)象。這意味著您可以將用戶庫和訪問控制協(xié)議存儲(chǔ)在任何一種這樣的數(shù)據(jù)存儲(chǔ)服務(wù)中,并且 Acegi 的管理器將在運(yùn)行時(shí)選擇合適的提供者。


4. 處理程序

有時(shí)任務(wù)可能會(huì)被分解為多個(gè)步驟,其中每個(gè)步驟由一個(gè)特定的處理程序執(zhí)行。比方說, Acegi 的 注銷過濾器 使用兩個(gè)處理程序來退出一個(gè) HTTP 客戶機(jī)。其中一個(gè)處理程序使用戶的 HTTP 會(huì)話無效,而另一個(gè)處理程序則刪除用戶的 cookie 。當(dāng)根據(jù)應(yīng)用程序需求配置 Acegi 時(shí),多個(gè)處理程序能夠提供很好的靈活性。您可以使用自己選擇的處理程序來執(zhí)行保護(hù)應(yīng)用程序所需的步驟。

?

安全過濾器

正如我前面提到的一樣, Acegi 使用安全過濾器為企業(yè)應(yīng)用程序提供身份驗(yàn)證和授權(quán)服務(wù)。您可以根據(jù)應(yīng)用程序的需要使用和配置不同類型的過濾器。這一節(jié)將介紹五種最重要的 Acegi 安全過濾器。

?

Session Integration Filter ?

Acegi Session Integration Filter SIF 通常是您將要配置的第一個(gè)過濾器。 SIF 創(chuàng)建了一個(gè) 安全上下文對(duì)象 ,這是一個(gè)與安全相關(guān)的信息的占位符。其他 Acegi 過濾器將安全信息保存在安全上下文中,也會(huì)使用安全上下文中可用的安全信息。

SIF 創(chuàng)建安全上下文并調(diào)用過濾器鏈中的其他過濾器。然后其他過濾器檢索安全上下文并對(duì)其進(jìn)行更改。比如, Authentication Processing Filter 將用戶信息(如用戶名、密碼和電子郵件地址)存儲(chǔ)在安全上下文中。

當(dāng)所有的處理程序完成處理后, SIF 檢查安全上下文是否更新。如果任何一個(gè)過濾器對(duì)安全上下文做出了更改, SIF 將把更改保存到服務(wù)器端的會(huì)話對(duì)象中。如果安全上下文中沒有發(fā)現(xiàn)任何更改,那么 SIF 將刪除它。

XML 配置文件中對(duì) SIF 進(jìn)行了配置,如清單 2 所示:

    <bean id="httpSessionContextIntegrationFilter" 
class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"/>
  
?

Authentication Processing Filter

Acegi 使用 Authentication Processing Filter ( APF ) 進(jìn)行身份驗(yàn)證。 APF 使用一個(gè)身份驗(yàn)證(或登錄)表單,用戶在其中輸入用戶名和密碼,并觸發(fā)身份驗(yàn)證。

APF 執(zhí)行所有的后端身份驗(yàn)證處理任務(wù),比如從客戶機(jī)請(qǐng)求中提取用戶名和密碼,從后端用戶庫中讀取用戶參數(shù),以及使用這些信息對(duì)用戶進(jìn)行身份驗(yàn)證。

在配置 APF 時(shí),您必須提供如下參數(shù):

  • <!----> Authentication manager 指定了用來管理身份驗(yàn)證提供者的身份驗(yàn)證管理器。
  • <!----> Filter processes URL 指定了客戶在登錄窗口中按下 Sign In 按鈕時(shí)要訪問的 URL 。收到這個(gè) URL 的請(qǐng)求后, Acegi 立即調(diào)用 APF
  • <!----> Default target URL 指定了成功進(jìn)行身份驗(yàn)證和授權(quán)后呈現(xiàn)給用戶的頁面。
  • <!----> Authentication failure URL 指定了身份驗(yàn)證失敗情況下用戶看到的頁面。

APF 從用戶的請(qǐng)求對(duì)象中得到用戶名、密碼和其他信息。它將這些信息傳送給身份驗(yàn)證管理器。身份驗(yàn)證管理器使用適當(dāng)?shù)奶峁┱邚暮蠖擞脩魩熘凶x取詳細(xì)的用戶信息(如用戶名、密碼、電子郵件地址和用戶訪問權(quán)利或特權(quán)),對(duì)用戶進(jìn)行身份驗(yàn)證,并將信息存儲(chǔ)在一個(gè) Authentication 對(duì)象中。

最后, APF Authentication 對(duì)象保存在 SIF 之前創(chuàng)建的安全上下文中。存儲(chǔ)在安全上下文中的 Authentication 對(duì)象將用于做出授權(quán)決策。

APF 的配置如清單 3 所示:
<!---->

    <bean id="authenticationProcessingFilter"
    class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
    <property name="authenticationManager" ref="authenticationManager" />
    <property name="filterProcessesUrl" value="/j_acegi_security_check" />
    <property name="defaultTargetUrl" value="/protected/protected1.jsp" />
    <property name="authenticationFailureUrl" value="/login.jsp?login_error=1" />
</bean>
  

可以從這段代碼中看到, APF 依賴于上面討論的這四個(gè)參數(shù)。每個(gè)參數(shù)都是作為清單 3 所示的 <property> 標(biāo)記配置的。

?

Logout Processing Filter

Acegi 使用一個(gè) Logout Processing Filer ( LPF ) 管理注銷處理。當(dāng)客戶機(jī)發(fā)來注銷請(qǐng)求時(shí),將使用 LPF 進(jìn)行處理。它標(biāo)識(shí)了來自由客戶機(jī)所調(diào)用 URL 的注銷請(qǐng)求。

LPF 的配置如清單 4 所示:

    <bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">
    <constructor-arg value="/logoutSuccess.jsp"/>
    <constructor-arg>
        <list>
         <bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/>
        </list>
    </constructor-arg>
</bean>
  

? 可以看到 LPF 在其構(gòu)造方法中包含兩個(gè)參數(shù):注銷成功 URL /logoutSuccess.jsp )和處理程序列表。注銷成功 URL 用來在注銷過程完成后重定向客戶機(jī)。處理程序執(zhí)行實(shí)際的注銷過程;我在這里只配置了一個(gè)處理程序,因?yàn)橹恍枰粋€(gè)處理程序就可以使 HTTP 會(huì)話變?yōu)闊o效。

?

Exception Translation Filter

Exception Translation Filter ETF 處理身份驗(yàn)證和授權(quán)過程中的異常情況,比如授權(quán)失敗。在這些異常情況中, ETF 將決定如何進(jìn)行操作。

比如,如果一個(gè)沒有進(jìn)行身份驗(yàn)證的用戶試圖訪問受保護(hù)的資源, ETF 將顯示一個(gè)登錄頁面要求用戶進(jìn)行身份驗(yàn)證。類似地,在授權(quán)失敗的情況下,可以配置 ETF 來呈現(xiàn)一個(gè) Access Denied 頁面。 ETF 的配置如清單 5 所示:

    <bean id="exceptionTranslationFilter"
    class="org.acegisecurity.ui.ExceptionTranslationFilter">
    <property name="authenticationEntryPoint">
<bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
            <property name="loginFormUrl" value="/login.jsp" />
        </bean>
    </property>
    <property name="accessDeniedHandler">
        <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
            <property name="errorPage" value="/accessDenied.jsp" />
        </bean>
    </property>
</bean>
  

正如清單 5 所示, ETF 包含兩個(gè)參數(shù),名為 authenticationEntryPoint accessDeniedHandler authenticationEntryPoint 屬性指定登錄頁面,而 accessDeniedHandler 指定 Access Denied 頁面。

?

攔截過濾器

Acegi 的攔截過濾器 用于做出授權(quán)決策。您需要在 APF 成功執(zhí)行身份驗(yàn)證后對(duì)攔截過濾器進(jìn)行配置,以使其發(fā)揮作用。攔截器使用應(yīng)用程序的訪問控制策略來做出授權(quán)決定。

?

配置簡單的訪問控制策略可分為兩個(gè)步驟:

<!----> 1. 編寫訪問控制策略。 <!---->

<!----> 2. 根據(jù)策略配置 Acegi 的攔截過濾器。 <!---->

?

步驟 1. 編寫簡單的訪問控制策略
首先看一下 清單 6 ,它展示了如何定義一個(gè)用戶及其用戶角色:
清單 6. 為用戶定義簡單的訪問控制策略

    alice=123,ROLE_HEAD_OF_ENGINEERING
  

清單 6 所示的訪問控制策略定義了用戶名 alice ,它的密碼是 123 ,角色是 ROLE_HEAD_OF_ENGINEERING

?

步驟 2. 配置 Acegi 的攔截過濾器
攔截過濾器使用三個(gè)組件來做出授權(quán)決策,我在清單 7 中對(duì)其進(jìn)行了配置:
清單 7. 配置攔截過濾器

    <bean id="filterInvocationInterceptor"
    class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
    <property name="authenticationManager" ref="authenticationManager" />
    <property name="accessDecisionManager" ref="accessDecisionManager" />
    <property name="objectDefinitionSource">
        <value>
            CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
            PATTERN_TYPE_APACHE_ANT
            /protected/**=ROLE_HEAD_OF_ENGINEERING
            /**=IS_AUTHENTICATED_ANONYMOUSLY
        </value>
    </property>
    <!--  More properties of the interceptor filter -->
</bean>
  

如清單 7 所示,配置所需的三個(gè)組件是 authenticationManager accessDecisionManager objectDefinitionSource

  • <!----> <!----> authenticationManager 組件與我在介紹 Authentication Processing Filter 時(shí)討論過的身份驗(yàn)證管理器相同。攔截過濾器可以在授權(quán)的過程中使用 authenticationManager 重新對(duì)客戶機(jī)進(jìn)行身份驗(yàn)證。 ?
  • <!----> accessDecisionManager 組件管理授權(quán)過程,這部分內(nèi)容將在本系列的下篇文章中詳細(xì)討論。
  • <!----> <!----> objectDefinitionSource 組件包含對(duì)應(yīng)于將要發(fā)生的授權(quán)的訪問控制定義。例如,清單 7 中的 objectDefinitionSource 屬性值包含兩個(gè) URL /protected/* /* )。其值定義了這些 URL 的角色。 /protected/* URL 的角色是 ROLE_HEAD_OF_ENGINEERING 。您可以根據(jù)應(yīng)用程序的需要定義任何角色。

回想一下 清單 6 ,您為用戶名 alice 定義了 ROLE_HEAD_OF_ENGINEERING 。這就是說 alice 將能夠訪問 /protected/* URL

?

過濾器工作原理

正如您已經(jīng)了解到的一樣, Acegi 的組件彼此依賴,從而對(duì)您的應(yīng)用程序進(jìn)行保護(hù)。在本文后面的部分,您將看到如何對(duì) Acegi 進(jìn)行配置,從而按照特定的順序應(yīng)用安全過濾器,因此需要?jiǎng)?chuàng)建過濾器鏈。出于這個(gè)目的, Acegi 保存了一個(gè)過濾器鏈對(duì)象,它封裝了為保護(hù)應(yīng)用程序而配置了的所有過濾器。圖 1 展示了 Acegi 過濾器鏈的生命周期,該周期從客戶機(jī)向您的應(yīng)用程序發(fā)送 HTTP 請(qǐng)求開始。

1. 托管 Acegi 過濾器鏈以安全地為瀏覽器客戶機(jī)服務(wù)的容器

?

?

下面的步驟描述了過濾器鏈的生命周期: ?

<!----> 1. 瀏覽器客戶機(jī)向您的應(yīng)用程序發(fā)送 HTTP 請(qǐng)求。 <!---->

<!----> 2. 容器接收到 HTTP 請(qǐng)求并創(chuàng)建一個(gè)請(qǐng)求對(duì)象,該對(duì)象將封裝 HTTP 請(qǐng)求中包含的信息。容器還創(chuàng)建一個(gè)各種過濾器都可處理的響應(yīng)對(duì)象,從而為發(fā)出請(qǐng)求的客戶機(jī)準(zhǔn)備好 HTTP 響應(yīng)。容器然后調(diào)用 Acegi 的過濾器鏈代理,這是一個(gè)代理過濾器。該代理知道應(yīng)用的過濾器的實(shí)際順序。當(dāng)容器調(diào)用代理時(shí),它將向代理發(fā)送請(qǐng)求、響應(yīng)以及過濾器鏈對(duì)象。 <!---->

<!----> 3. 代理過濾器調(diào)用過濾器鏈中第一個(gè)過濾器,向其發(fā)送請(qǐng)求、響應(yīng)和過濾器鏈對(duì)象。 <!---->

<!----> 4. 鏈中的過濾器逐個(gè)執(zhí)行其處理。一個(gè)過濾器可以通過調(diào)用過濾器鏈中下一個(gè)過濾器隨時(shí)終止自身處理。有的過濾器甚至根本不執(zhí)行任何處理(比如,如果 APF 發(fā)現(xiàn)一個(gè)到來的請(qǐng)求沒有要求身份驗(yàn)證,它可能會(huì)立即終止其處理)。 <!---->

<!----> 5. 當(dāng)身份驗(yàn)證過濾器完成其處理時(shí),這些過濾器將把請(qǐng)求和響應(yīng)對(duì)象發(fā)送到應(yīng)用程序中配置的攔截過濾器。 <!---->

<!----> 6. 攔截器決定是否對(duì)發(fā)出請(qǐng)求的客戶機(jī)進(jìn)行授權(quán),使它訪問所請(qǐng)求的資源。 <!---->

<!----> 7. 攔截器將控制權(quán)傳輸給應(yīng)用程序(比如,成功進(jìn)行了身份驗(yàn)證和授權(quán)的客戶機(jī)請(qǐng)求的 JSP 頁面)。 <!---->

<!----> 8. 應(yīng)用程序改寫響應(yīng)對(duì)象的內(nèi)容。 <!---->

<!----> 9. 響應(yīng)對(duì)象已經(jīng)準(zhǔn)備好了,容器將響應(yīng)對(duì)象轉(zhuǎn)換為 HTTP 響應(yīng),并將響應(yīng)發(fā)送到發(fā)出請(qǐng)求的客戶機(jī)。 <!---->

?

為幫助您進(jìn)一步理解 Acegi 過濾器,我將詳細(xì)探討其中兩個(gè)過濾器的操作: Session Integration Filter Authentication Processing Filter

?

SIF 如何創(chuàng)建一個(gè)安全上下文

現(xiàn)在詳細(xì)地考慮下面這些步驟:

?

<!----> 1. Acegi 的過濾器鏈代理調(diào)用 SIF 并向其發(fā)送請(qǐng)求、響應(yīng)和過濾器鏈對(duì)象。注意:通常將 SIF 配置為過濾器鏈中第一個(gè)過濾器。 <!---->

<!----> 2. SIF 檢查它是否已經(jīng)對(duì)這個(gè) Web 請(qǐng)求進(jìn)行過處理。如果是的話,它將不再進(jìn)一步進(jìn)行處理,并將控制權(quán)傳輸給過濾器鏈中的下一個(gè)過濾器(參見下面的第 4 個(gè)步驟)。如果 SIF 發(fā)現(xiàn)這是第一次對(duì)這個(gè) Web 請(qǐng)求調(diào)用 SIF ,它將設(shè)置一個(gè)標(biāo)記,將在下一次使用該標(biāo)記,以表示曾經(jīng)調(diào)用過 SIF <!---->

<!----> 3. SIF 將檢查是否存在一個(gè)會(huì)話對(duì)象,以及它是否包含安全上下文。它從會(huì)話對(duì)象中檢索安全上下文,并將其放置在名為 security context holder 的臨時(shí)占位符中。如果不存在會(huì)話對(duì)象, SIF 將創(chuàng)建一個(gè)新的安全上下文,并將它放到 security context holder 中。注意: security context holder 位于應(yīng)用程序的范圍內(nèi),所以可以被其他的安全過濾器訪問。 <!---->

<!----> 4. SIF 調(diào)用過濾器鏈中的下一個(gè)過濾器。 <!---->

<!----> 5. 其他過濾器可以編輯安全上下文。 <!---->

<!----> 6. SIF 在過濾器鏈完成處理后接收控制權(quán)。 <!---->

<!----> 7. SIF 檢查其他的過濾器是否在其處理過程中更改了安全上下文(比如, APF 可能將用戶詳細(xì)信息存儲(chǔ)在安全上下文中)。如果是的話,它將更新會(huì)話對(duì)象中的安全上下文。就是說在過濾器鏈處理過程中,對(duì)安全上下文的任何更改現(xiàn)在都保存在會(huì)話對(duì)象中。 <!---->

?

APF 如何對(duì)用戶進(jìn)行身份驗(yàn)證

現(xiàn)在仔細(xì)考慮以下這些步驟:

<!----> 1. 過濾器鏈中前面的過濾器向 APF 發(fā)送請(qǐng)求、響應(yīng)和過濾鏈對(duì)象。 <!---->

<!----> 2. APF 使用從請(qǐng)求對(duì)象中獲得的用戶名、密碼以及其他信息創(chuàng)建身份驗(yàn)證標(biāo)記。 <!---->

<!----> 3. APF 將身份驗(yàn)證標(biāo)記傳遞給身份驗(yàn)證管理器。 <!---->

<!----> 4. 身份驗(yàn)證管理器可能包含一個(gè)或更多身份驗(yàn)證提供者。每個(gè)提供者恰好支持一種類型的身份驗(yàn)證。管理器檢查哪一種提供者支持它從 APF 收到的身份驗(yàn)證標(biāo)記。 <!---->

<!----> 5. 身份驗(yàn)證管理器將身份驗(yàn)證標(biāo)記發(fā)送到適合進(jìn)行身份驗(yàn)證的提供者。 <!---->

<!----> 6. 身份驗(yàn)證提供者支持從身份驗(yàn)證標(biāo)記中提取用戶名,并將它發(fā)送給名為 user cache service 的服務(wù)。 Acegi 緩存了已經(jīng)進(jìn)行過身份驗(yàn)證的用戶。該用戶下次登錄時(shí), Acegi 可以從緩存中加載他或她的詳細(xì)信息(比如用戶名、密碼和權(quán)限),而不是從后端數(shù)據(jù)存儲(chǔ)中讀取數(shù)據(jù)。這種方法使得性能得到了改善。 <!---->

<!----> 7. user cache service 檢查用戶的詳細(xì)信息是否存在于緩存中。 <!---->

<!----> 8. user cache service 將用戶的詳細(xì)信息返回給身份驗(yàn)證提供者。如果緩存不包含用戶詳細(xì)信息,則返回 null <!---->

<!----> 9. 身份驗(yàn)證提供者檢查緩存服務(wù)返回的是用戶的詳細(xì)信息還是 null <!---->

<!----> 10. 如果緩存返回 null ,身份驗(yàn)證提供者將用戶名(在步驟 6 中提取)發(fā)送給另一個(gè)名為 user details service 的服務(wù)。 <!---->

<!----> 11. user details service 與包含用戶詳細(xì)信息的后端數(shù)據(jù)存儲(chǔ)通信(如目錄服務(wù))。 <!---->

<!----> 12. user details service 返回用戶的詳細(xì)信息,或者,如果找不到用戶詳細(xì)信息則拋出身份驗(yàn)證異常。 <!---->

<!----> 13. 如果 user cache service 或者 user details service 返回有效的用戶詳細(xì)信息,身份驗(yàn)證提供者將使用 user cache service user details service 返回的密碼來匹配用戶提供的安全標(biāo)記(如密碼)。如果找到一個(gè)匹配,身份驗(yàn)證提供者將用戶的詳細(xì)信息返回給身份驗(yàn)證管理器。否則的話,則拋出一個(gè)身份驗(yàn)證異常。 <!---->

<!----> 14. 身份驗(yàn)證管理器將用戶的詳細(xì)信息返回給 APF 。這樣用戶就成功地進(jìn)行了身份驗(yàn)證。 <!---->

<!----> 15. APF 將用戶詳細(xì)信息保存在 圖 2 所示由步驟 3 創(chuàng)建的安全上下文中。 <!---->

<!----> 16. APF 將控制權(quán)傳輸給過濾器鏈中的下一個(gè)過濾器。 <!---->

?

一個(gè)簡單的 Acegi 應(yīng)用程序

?

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	<bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
		<property name="filterInvocationDefinitionSource">
			<value>
				CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
				PATTERN_TYPE_APACHE_ANT
				/**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,securityContextHolderAwareRequestFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor
			</value>
		</property>
	</bean>

    <!-- SIF創(chuàng)建了一個(gè)安全上下文對(duì)象并調(diào)用過濾器鏈中的其他過濾器 -->
	<bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter" />

    <!-- 管理注銷處理 -->
	<bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">
		<constructor-arg value="/logoutSuccess.jsp" />
		<constructor-arg>
			<list>
				<bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler" />
			</list>
		</constructor-arg>
	</bean>

    <!-- Acegi使用APF進(jìn)行身份驗(yàn)證 -->
	<bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
		<!-- 指定用來管理身份驗(yàn)證提供者的身份驗(yàn)證管理器 -->
		<property name="authenticationManager" ref="authenticationManager" />
		<!-- 指定了身份驗(yàn)證失敗情況下用戶看到的頁面 -->
		<property name="authenticationFailureUrl" value="/login.jsp?login_error=1" />
		<!-- 指定了成功進(jìn)行身份驗(yàn)證和授權(quán)后呈現(xiàn)給用戶的頁面 -->
		<property name="defaultTargetUrl" value="/protected/protected1.jsp" />
		<!-- 指定了客戶在登錄窗口中按下 Sign In 按鈕時(shí)要訪問的 URL -->
		<property name="filterProcessesUrl" value="/j_acegi_security_check" />
	</bean>

    <!-- 處理身份驗(yàn)證和授權(quán)過程中的異常情況 -->
	<bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
		<!-- 對(duì)沒有進(jìn)行身份驗(yàn)證的用戶試圖訪問受保護(hù)的資源時(shí),指定一個(gè)登錄頁面要求用戶進(jìn)行身份驗(yàn)證 -->
		<property name="authenticationEntryPoint">
			<bean
				class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
				<property name="loginFormUrl" value="/login.jsp" />
			</bean>
		</property>
		<!-- 在授權(quán)失敗的情況下,呈現(xiàn)的Access Denied 頁面 -->
		<property name="accessDeniedHandler">
			<bean
				class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
				<property name="errorPage" value="/accessDenied.jsp" />
			</bean>
		</property>
	</bean>

    <!-- 用于做出授權(quán)決策的攔截過濾器 -->
	<bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
		<!-- 可以在授權(quán)的過程中,重新對(duì)客戶機(jī)進(jìn)行身份驗(yàn)證 -->
		<property name="authenticationManager" ref="authenticationManager" />
		<!-- 管理授權(quán)過程 -->
		<property name="accessDecisionManager" ref="accessDecisionManager" />
		<!-- 對(duì)應(yīng)于將要發(fā)生的授權(quán)的訪問控制定義 -->
		<property name="objectDefinitionSource">
			<value>
				CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
				PATTERN_TYPE_APACHE_ANT
				/protected/**=ROLE_HEAD_OF_ENGINEERING
				/**=IS_AUTHENTICATED_ANONYMOUSLY
			</value>
		</property>
	</bean>
	
	<bean id="securityContextHolderAwareRequestFilter"
		class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter" />

	<bean id="anonymousProcessingFilter"
		class="org.acegisecurity.providers.anonymous.AnonymousProcessingFilter">
		<property name="key" value="changeThis" />
		<property name="userAttribute"
			value="anonymousUser,ROLE_ANONYMOUS" />
	</bean>

	<bean id="authenticationManager"
		class="org.acegisecurity.providers.ProviderManager">
		<property name="providers">
			<list>
				<ref local="daoAuthenticationProvider" />
			</list>
		</property>
	</bean>

	<bean id="accessDecisionManager"
		class="org.acegisecurity.vote.AffirmativeBased">
		<property name="allowIfAllAbstainDecisions" value="false" />
		<property name="decisionVoters">
			<list>
				<bean class="org.acegisecurity.vote.RoleVoter" />
				<bean class="org.acegisecurity.vote.AuthenticatedVoter" />
			</list>
		</property>
	</bean>

	<bean id="daoAuthenticationProvider"
		class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
		<property name="userDetailsService" ref="userDetailsService" />
		<!-- UserCache property will activate the cache, it is not 
			mandatory but increases performance by cacheing the user 
			details retrieved from user-base -->
		<property name="userCache" ref="userCache" />
	</bean>

	<bean id="userDetailsService"
		class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">
		<property name="userProperties">
			<bean
				class="org.springframework.beans.factory.config.PropertiesFactoryBean">
				<property name="location"
					value="/WEB-INF/users.properties" />
			</bean>
		</property>
	</bean>

	<bean id="userCache"
		class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache">
		<property name="cache">
			<bean
				class="org.springframework.cache.ehcache.EhCacheFactoryBean">
				<property name="cacheManager">
					<bean
						class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" />
				</property>
				<property name="cacheName" value="userCache" />
			</bean>
		</property>
	</bean>

	<!-- This bean is optional; it isn't used by any other bean as it only listens and logs -->
	<bean id="loggerListener" class="org.acegisecurity.event.authentication.LoggerListener" />
</beans>
  
?

?

?

Acegi 應(yīng)用基礎(chǔ)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 久久亚洲最大成人网4438 | 激情五月婷婷 | av一区二区三区四区 | 五月激情六月 | 亚洲视频在线看 | 天天操夜夜嗨 | 久久中文字幕视频 | 谍影特工在线观看完整版 | 苏晓晖个人简介军衔 | 黄色毛片视频网站 | 欧美精品观看 | 黄片毛片一级 | 日日操视频 | 国产美女精品 | 欧美日韩中文 | 成人午夜视频在线观看 | 青青国产在线视频 | 日本a视频 | 亚洲国内精品 | 久久99国产精品久久99无号码 | 黄色一级大片在线免费看产 | 亚洲国产精品久久久久网站 | 免费一区二区三区 | 国产乳摇福利视频在线观看 | 色欧美片视频在线观看 | 天天噜噜揉揉狠狠夜夜 | 操操操操网 | 久草视| 国产自产拍精品视频免费看 | 色综合综合在线 | 久久精品一 | 亚洲视频一区在线 | 一个人看aaaa免费中文 | 色欲天天婬色婬香影院 | 好大好爽快点视频 | 九一在线观看 | 国产乱码精品一区二区三上 | 色综合网站 | 黄色视屏免费观看 | 好吊色欧美一区二区三区四区 | 99国产精品久久久久久久成人热 |