乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      使用 Acegi 保護(hù) Java 應(yīng)用程序,第 1 部分: 架構(gòu)概覽和安全過(guò)濾器

       Long_way 2007-06-25

      2007 年 5 月 08 日

      這份共分三部分的系列文章介紹了 Acegi 安全系統(tǒng)(Acegi Security System),它是用于 Java? 企業(yè)應(yīng)用程序的強(qiáng)大的開(kāi)源安全框架。在第一篇文章中,Bilal Siddiqui 顧問(wèn)將向您介紹 Acegi 的架構(gòu)和組件,并展示如何使用它來(lái)保護(hù)一個(gè)簡(jiǎn)單的 Java 企業(yè)應(yīng)用程序。

      Acegi Security System 是一種功能強(qiáng)大并易于使用的替代性方案,使您不必再為 Java 企業(yè)應(yīng)用程序編寫(xiě)大量的安全代碼。雖然它專門(mén)針對(duì)使用 Spring 框架編寫(xiě)的應(yīng)用程序,但是任何類型的 Java 應(yīng)用程序都沒(méi)有理由不去使用 Acegi。這份共分三部分的系列文章詳細(xì)介紹了 Acegi,并展示了如何使用它保護(hù)簡(jiǎn)單的企業(yè)應(yīng)用程序以及更復(fù)雜的應(yīng)用程序。

      本系列首先介紹企業(yè)應(yīng)用程序中常見(jiàn)的安全問(wèn)題,并說(shuō)明 Acegi 如何解決這些問(wèn)題。您將了解 Acegi 的架構(gòu)模型及其安全過(guò)濾器,后者包含了在保護(hù)應(yīng)用程序中將用到的大多數(shù)功能。您還將了解到各個(gè)過(guò)濾器如何單獨(dú)進(jìn)行工作,如何將它們組合起來(lái),以及過(guò)濾器如何在一個(gè)企業(yè)安全實(shí)現(xiàn)中將各種功能從頭到尾地鏈接起來(lái)。本文最后通過(guò)一個(gè)樣例應(yīng)用程序演示了基于 URL 安全系統(tǒng)的 Acegi 實(shí)現(xiàn)。本系列后續(xù)兩篇文章將探究 Acegi 的一些更高級(jí)的應(yīng)用,包括如何設(shè)計(jì)和托管訪問(wèn)控制策略,然后如何去配置 Acegi 以使用這些策略。

      您必須 下載 Acegi,這樣才能編譯本文的示例代碼并運(yùn)行本文的樣例應(yīng)用程序。還必須有作為工作站的一部分運(yùn)行的 Tomcat 服務(wù)器。

      企業(yè)應(yīng)用程序安全性

      由于企業(yè)內(nèi)容管理(ECM)應(yīng)用程序管理存儲(chǔ)在不同類型數(shù)據(jù)源(如文件系統(tǒng)、關(guān)系數(shù)據(jù)庫(kù)和目錄服務(wù))中的企業(yè)內(nèi)容的編寫(xiě)和處理,ECM 安全性要求對(duì)這些數(shù)據(jù)源的訪問(wèn)進(jìn)行控制。比如,一個(gè) ECM 應(yīng)用程序可能會(huì)控制被授權(quán)讀取、編輯或刪除數(shù)據(jù)的對(duì)象,而這些數(shù)據(jù)和制造業(yè)企業(yè)的設(shè)計(jì)、市場(chǎng)營(yíng)銷、生產(chǎn)以及質(zhì)量控制有關(guān)。

      在一個(gè) ECM 安全場(chǎng)景中,比較常見(jiàn)的就是通過(guò)對(duì)企業(yè)資源定位符(或網(wǎng)絡(luò)地址)應(yīng)用安全性,從而實(shí)現(xiàn)訪問(wèn)控制。這種簡(jiǎn)單的安全模型被稱為統(tǒng)一資源定位符 或 URL 安全性。正如我在本文后面(以及本系列后續(xù)文章)所演示的一樣,Acegi 為實(shí)現(xiàn) URL 安全性提供了全面的特性。

      然而,在很多企業(yè)場(chǎng)景中,URL 安全性還遠(yuǎn)遠(yuǎn)不夠。比如,假設(shè)一個(gè) PDF 文檔包含某個(gè)制造業(yè)公司生產(chǎn)的特殊產(chǎn)品的數(shù)據(jù)。文檔的一部分包含了將由該公司的設(shè)計(jì)部門(mén)編輯和更新的設(shè)計(jì)數(shù)據(jù)。另一部分包含了生產(chǎn)經(jīng)理將使用的生產(chǎn)數(shù)據(jù)。對(duì)于諸如此類的場(chǎng)景,需要實(shí)現(xiàn)更加細(xì)粒度的安全性,對(duì)文檔的不同部分應(yīng)用不同的訪問(wèn)權(quán)限。

      本文介紹了 Acegi 為實(shí)現(xiàn) URL 安全性而提供的各種功能。本系列的下一篇文章將演示此框架的基于方法的安全性,它提供了對(duì)企業(yè)數(shù)據(jù)訪問(wèn)的更細(xì)粒度的控制。





      回頁(yè)首


      Acegi Security System

      Acegi Security System 使用安全過(guò)濾器來(lái)提供企業(yè)應(yīng)用程序的身份驗(yàn)證和授權(quán)服務(wù)。該框架提供了不同類型的過(guò)濾器,可以根據(jù)應(yīng)用程序的需求進(jìn)行配置。您將在本文后面了解到 安全過(guò)濾器的不同類型;現(xiàn)在,只需注意可以為如下任務(wù)配置 Acegi 安全過(guò)濾器:

      1. 在訪問(wèn)一個(gè)安全資源之前提示用戶登錄。

      2. 通過(guò)檢查安全標(biāo)記(如密碼),對(duì)用戶進(jìn)行身份驗(yàn)證。

      3. 檢查經(jīng)過(guò)身份驗(yàn)證的用戶是否具有訪問(wèn)某個(gè)安全資源的特權(quán)。

      4. 將成功進(jìn)行身份驗(yàn)證和授權(quán)的用戶重定向到所請(qǐng)求的安全資源。

      5. 對(duì)不具備訪問(wèn)安全資源特權(quán)的用戶顯示 Access Denied 頁(yè)面。

      6. 在服務(wù)器上記錄成功進(jìn)行身份驗(yàn)證的用戶,并在用戶的客戶機(jī)上設(shè)置安全 cookie。使用該 cookie 執(zhí)行下一次身份驗(yàn)證,而無(wú)需要求用戶登錄。

      7. 將身份驗(yàn)證信息存儲(chǔ)在服務(wù)器端的會(huì)話對(duì)象中,從而安全地進(jìn)行對(duì)資源的后續(xù)請(qǐng)求。

      8. 在服務(wù)器端對(duì)象中構(gòu)建并保存安全信息的緩存,從而優(yōu)化性能。

      9. 當(dāng)用戶退出時(shí),刪除為用戶安全會(huì)話而保存的服務(wù)器端對(duì)象。

      10. 與大量后端數(shù)據(jù)存儲(chǔ)服務(wù)(如目錄服務(wù)或關(guān)系數(shù)據(jù)庫(kù))進(jìn)行通信,這些服務(wù)用于存儲(chǔ)用戶的安全信息和 ECM 的訪問(wèn)控制策略。

      正如這個(gè)列表顯示的那樣,Acegi 的安全過(guò)濾器允許您執(zhí)行保護(hù)企業(yè)應(yīng)用程序所需的幾乎任何事情。






      架構(gòu)和組件

      對(duì) Acegi 了解越多,使用起來(lái)就越簡(jiǎn)單。這一節(jié)介紹 Acegi 的組件;接下來(lái)您將了解該框架如何使用反轉(zhuǎn)控制(IOC)和 XML 配置文件來(lái)組合組件并表示它們的依賴關(guān)系。

      四大組件

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

      過(guò)濾器
      這種最高級(jí)的組件提供了常見(jiàn)的安全服務(wù),如身份驗(yàn)證、會(huì)話處理以及注銷。我將在 本文后面的部分 深入討論過(guò)濾器。
      管理器
      過(guò)濾器僅是安全相關(guān)功能的高級(jí)抽象:實(shí)際上要使用管理器和提供者實(shí)現(xiàn)身份驗(yàn)證處理和注銷服務(wù)。管理器管理由不同提供者提供的較低級(jí)的安全服務(wù)。
      提供者
      有大量的提供者可用于和不同類型的數(shù)據(jù)存儲(chǔ)服務(wù)通信,例如目錄服務(wù)、關(guān)系數(shù)據(jù)庫(kù)或簡(jiǎn)單的內(nèi)存中的對(duì)象。這意味著您可以將用戶庫(kù)和訪問(wèn)控制協(xié)議存儲(chǔ)在任何一種這樣的數(shù)據(jù)存儲(chǔ)服務(wù)中,并且 Acegi 的管理器將在運(yùn)行時(shí)選擇合適的提供者。
      處理程序
      有時(shí)任務(wù)可能會(huì)被分解為多個(gè)步驟,其中每個(gè)步驟由一個(gè)特定的處理程序執(zhí)行。比方說(shuō),Acegi 的 注銷過(guò)濾器 使用兩個(gè)處理程序來(lái)退出一個(gè) HTTP 客戶機(jī)。其中一個(gè)處理程序使用戶的 HTTP 會(huì)話無(wú)效,而另一個(gè)處理程序則刪除用戶的 cookie。當(dāng)根據(jù)應(yīng)用程序需求配置 Acegi 時(shí),多個(gè)處理程序能夠提供很好的靈活性。您可以使用自己選擇的處理程序來(lái)執(zhí)行保護(hù)應(yīng)用程序所需的步驟。

      反轉(zhuǎn)控制

      Acegi 的組件通過(guò)彼此之間的依賴來(lái)對(duì)企業(yè)應(yīng)用程序進(jìn)行保護(hù)。比如,一個(gè)身份驗(yàn)證處理過(guò)濾器需要一個(gè)身份驗(yàn)證管理器選擇一個(gè)合適的身份驗(yàn)證提供者。這就是說(shuō)您必須能夠表示和管理 Acegi 組件的依賴關(guān)系。

      IOC 實(shí)現(xiàn)通常用于管理 Java 組件之間的依賴關(guān)系。IOC 提供了兩個(gè)重要的特性:

      1. 它提供了一種語(yǔ)法,表示應(yīng)用程序所需的組件以及這些組件如何相互依賴。

      2. 它保證了所需的組件在運(yùn)行時(shí)是可用的。

      XML 配置文件

      Acegi 使用 Spring 框架(請(qǐng)參見(jiàn) 參考資料)附帶的流行開(kāi)源 IOC 實(shí)現(xiàn)來(lái)管理其組件。Spring 需要您編寫(xiě)一個(gè) XML 配置文件來(lái)表示組件的依賴關(guān)系,如清單 1 所示:


      清單 1. Spring 配置文件的結(jié)構(gòu)
                              <beans>
                              <bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
                              <property name="filterInvocationDefinitionSource">
                              <value> value here </value>
                              </property>
                              </bean>
                              <bean id="authenticationProcessingFilter"
                              class="org.acegisecurity.ui.webapp.AuthenticationProcessingFitler">
                              <property name="authenticationManager" ref="authManager"/>
                              <!-- Other properties -->
                              </bean>
                              <bean id="authManager"
                              class="org.acegisecurity.providers.ProviderManager">
                              <property name="providers">
                              <!--  List of providers here -->
                              </property>
                              </bean>
                              <!-- Other bean tags -->
                              </beans>
                              

      如您所見(jiàn),Acegi 使用的 Spring XML 配置文件包含一個(gè) <beans> 標(biāo)記,它封裝了一些其他的 <bean> 標(biāo)記。所有的 Acegi 組件(即過(guò)濾器、管理器、提供者等)實(shí)際上都是 JavaBean。XML 配置文件中的每個(gè) <bean> 標(biāo)記都代表一個(gè) Acegi 組件。

      進(jìn)一步解釋 XML 配置文件

      首先將注意到的是每個(gè) <bean> 標(biāo)記都包含一個(gè) class 屬性,這個(gè)屬性標(biāo)識(shí)組件所使用的類。<bean> 標(biāo)記還具有一個(gè) id 屬性,它標(biāo)識(shí)作為 Acegi 組件工作的實(shí)例(Java 對(duì)象)。

      比方說(shuō),清單 1 的第一個(gè) <bean> 標(biāo)記標(biāo)識(shí)了名為 filterChainProxy 的組件實(shí)例,它是名為 org.acegisecurity.util.FilterChainProxy 的類的實(shí)例。

      使用 <bean> 標(biāo)記的子標(biāo)記來(lái)表示 bean 的依賴關(guān)系。比如,注意第一個(gè) <bean> 標(biāo)記的 <property> 子標(biāo)記。<property> 子標(biāo)記定義了 <bean> 標(biāo)記依賴的其他 bean 或值。

      所以在 清單 1 中,第一個(gè) <bean> 標(biāo)記的 <property> 子標(biāo)記具有一個(gè) name 屬性和一個(gè) <value> 子標(biāo)記,分別定義了這個(gè) bean 依賴的屬性的名稱和值。

      同樣,清單 1 中的第二個(gè)和第三個(gè) <bean> 標(biāo)記定義了一個(gè)過(guò)濾器 bean 依賴于一個(gè)管理器 bean。第二個(gè) <bean> 標(biāo)記表示過(guò)濾器 bean,而第三個(gè) <bean> 標(biāo)記表示管理器 bean。

      過(guò)濾器的 <bean> 標(biāo)記包含一個(gè) <property> 子標(biāo)記,該子標(biāo)記具有兩個(gè)屬性:namerefname 屬性定義了過(guò)濾器 bean 的屬性,而 ref 屬性引用了管理器 bean 的實(shí)例(名稱)。

      下一節(jié)將展示如何在 XML 配置文件中配置 Acegi 過(guò)濾器。在本文后面的內(nèi)容中,您將在一個(gè)樣例 Acegi 應(yīng)用程序中使用過(guò)濾器。





      安全過(guò)濾器

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

      Session Integration Filter

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

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

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

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


      清單 2. 配置 SIF
                              <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)求中提取用戶名和密碼,從后端用戶庫(kù)中讀取用戶參數(shù),以及使用這些信息對(duì)用戶進(jìn)行身份驗(yàn)證。

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

      • Authentication manager 指定了用來(lái)管理身份驗(yàn)證提供者的身份驗(yàn)證管理器。

      • Filter processes URL 指定了客戶在登錄窗口中按下 Sign In 按鈕時(shí)要訪問(wèn)的 URL。收到這個(gè) URL 的請(qǐng)求后,Acegi 立即調(diào)用 APF。

      • Default target URL 指定了成功進(jìn)行身份驗(yàn)證和授權(quán)后呈現(xiàn)給用戶的頁(yè)面。

      • Authentication failure URL 指定了身份驗(yàn)證失敗情況下用戶看到的頁(yè)面。

      APF 從用戶的請(qǐng)求對(duì)象中得到用戶名、密碼和其他信息。它將這些信息傳送給身份驗(yàn)證管理器。身份驗(yàn)證管理器使用適當(dāng)?shù)奶峁┱邚暮蠖擞脩魩?kù)中讀取詳細(xì)的用戶信息(如用戶名、密碼、電子郵件地址和用戶訪問(wèn)權(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 所示:


      清單 3. 配置 APF
                              <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ā)來(lái)注銷請(qǐng)求時(shí),將使用 LPF 進(jìn)行處理。它標(biāo)識(shí)了來(lái)自由客戶機(jī)所調(diào)用 URL 的注銷請(qǐng)求。

      LPF 的配置如清單 4 所示:


      清單 4. 配置 LPF
                              <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 用來(lái)在注銷過(guò)程完成后重定向客戶機(jī)。處理程序執(zhí)行實(shí)際的注銷過(guò)程;我在這里只配置了一個(gè)處理程序,因?yàn)橹恍枰粋€(gè)處理程序就可以使 HTTP 會(huì)話變?yōu)闊o(wú)效。我將在本系列下一篇文章中討論更多的處理程序。

      Exception Translation Filter

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

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

      ETF 的配置如清單 5 所示:


      清單 5. 配置 ETF
                              <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ù),名為 authenticationEntryPointaccessDeniedHandlerauthenticationEntryPoint 屬性指定登錄頁(yè)面,而 accessDeniedHandler 指定 Access Denied 頁(yè)面。

      攔截過(guò)濾器

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

      本系列的下一篇文章將展示如何設(shè)計(jì)訪問(wèn)控制策略,如何將它們托管在目錄服務(wù)中,以及如何配置 Acegi 以讀取您的訪問(wèn)控制策略。但是,目前我將繼續(xù)向您展示如何使用 Acegi 配置一個(gè)簡(jiǎn)單的訪問(wèn)控制策略。在本文后面的部分,您將看到使用簡(jiǎn)單的訪問(wèn)控制策略構(gòu)建一個(gè)樣例應(yīng)用程序。

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

      1. 編寫(xiě)訪問(wèn)控制策略。

      2. 根據(jù)策略配置 Acegi 的攔截過(guò)濾器。

      步驟 1. 編寫(xiě)簡(jiǎn)單的訪問(wèn)控制策略

      首先看一下 清單 6,它展示了如何定義一個(gè)用戶及其用戶角色:


      清單 6. 為用戶定義簡(jiǎn)單的訪問(wèn)控制策略
                              alice=123,ROLE_HEAD_OF_ENGINEERING
                              

      清單 6 所示的訪問(wèn)控制策略定義了用戶名 alice,它的密碼是 123,角色是 ROLE_HEAD_OF_ENGINEERING。(下一節(jié)將說(shuō)明如何在文件中定義任意數(shù)量的用戶及其用戶角色,然后配置攔截過(guò)濾器以使用這些文件。)

      步驟 2. 配置 Acegi 的攔截過(guò)濾器

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


      清單 7. 配置攔截過(guò)濾器
                              <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、accessDecisionManagerobjectDefinitionSource

      • authenticationManager 組件與我在介紹 Authentication Processing Filter 時(shí)討論過(guò)的身份驗(yàn)證管理器相同。攔截過(guò)濾器可以在授權(quán)的過(guò)程中使用 authenticationManager 重新對(duì)客戶機(jī)進(jìn)行身份驗(yàn)證。

      • accessDecisionManager 組件管理授權(quán)過(guò)程,這部分內(nèi)容將在本系列的下篇文章中詳細(xì)討論。

      • objectDefinitionSource 組件包含對(duì)應(yīng)于將要發(fā)生的授權(quán)的訪問(wèn)控制定義。例如,清單 7 中的 objectDefinitionSource 屬性值包含兩個(gè) URL(/protected/*/*)。其值定義了這些 URL 的角色。/protected/* URL 的角色是 ROLE_HEAD_OF_ENGINEERING。您可以根據(jù)應(yīng)用程序的需要定義任何角色。

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




      過(guò)濾器工作原理

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


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

      下面的步驟描述了過(guò)濾器鏈的生命周期:

      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è)各種過(guò)濾器都可處理的響應(yīng)對(duì)象,從而為發(fā)出請(qǐng)求的客戶機(jī)準(zhǔn)備好 HTTP 響應(yīng)。容器然后調(diào)用 Acegi 的過(guò)濾器鏈代理,這是一個(gè)代理過(guò)濾器。該代理知道應(yīng)用的過(guò)濾器的實(shí)際順序。當(dāng)容器調(diào)用代理時(shí),它將向代理發(fā)送請(qǐng)求、響應(yīng)以及過(guò)濾器鏈對(duì)象。

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

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

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

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

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

      8. 應(yīng)用程序改寫(xiě)響應(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 過(guò)濾器,我將詳細(xì)探討其中兩個(gè)過(guò)濾器的操作:Session Integration Filter 和 Authentication Processing Filter。

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

      圖 2 展示了 SIF 創(chuàng)建安全上下文所涉及到的步驟:


      圖 2. SIF 創(chuàng)建安全上下文
      SIF 如何創(chuàng)建安全上下文

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

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

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

      4. SIF 調(diào)用過(guò)濾器鏈中的下一個(gè)過(guò)濾器。

      5. 其他過(guò)濾器可以編輯安全上下文。

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

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

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

      圖 3 展示了 APF 對(duì)用戶進(jìn)行身份驗(yàn)證所涉及到的步驟:


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

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

      1. 過(guò)濾器鏈中前面的過(guò)濾器向 APF 發(fā)送請(qǐng)求、響應(yīng)和過(guò)濾鏈對(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)行過(guò)身份驗(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 中提?。┌l(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 返回的密碼來(lái)匹配用戶提供的安全標(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)傳輸給過(guò)濾器鏈中的下一個(gè)過(guò)濾器。





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

      在本文中,您已經(jīng)了解了很多關(guān)于 Acegi 的知識(shí),所以現(xiàn)在看一下利用您目前學(xué)到的知識(shí)能做些什么,從而結(jié)束本文。對(duì)于這個(gè)簡(jiǎn)單的演示,我設(shè)計(jì)了一個(gè)樣例應(yīng)用程序(參見(jiàn) 下載),并對(duì) Acegi 進(jìn)行了配置以保護(hù)它的一些資源。

      樣例應(yīng)用程序包含 5 個(gè) JSP 頁(yè)面:index.jsp、protected1.jsp、protected2.jsp、login.jsp 和 accessDenied.jsp。

      index.jsp 是應(yīng)用程序的歡迎頁(yè)面。它向用戶顯示了三個(gè)超鏈接,如圖 4 所示:


      圖 4. 樣例應(yīng)用程序的歡迎頁(yè)面:
      一個(gè)簡(jiǎn)單的 Acegi 應(yīng)用程序

      圖 4 所示的鏈接中,其中兩個(gè)鏈接指向了被保護(hù)的資源(protected1.jsp 和 protected2.jsp),第三個(gè)鏈接指向登錄頁(yè)面(login.jsp)。只有在 Acegi 發(fā)現(xiàn)用戶沒(méi)有被授權(quán)訪問(wèn)受保護(hù)的資源時(shí),才會(huì)顯示 accessDenied.jsp 頁(yè)面。

      如果用戶試圖訪問(wèn)任何受保護(hù)的頁(yè)面,樣例應(yīng)用程序?qū)@示登錄頁(yè)面。當(dāng)用戶使用登錄頁(yè)面進(jìn)入后,應(yīng)用程序?qū)⒆詣?dòng)重定向到被請(qǐng)求的受保護(hù)資源。

      用戶可以通過(guò)單擊歡迎頁(yè)面中的第三個(gè)鏈接直接請(qǐng)求登錄頁(yè)面。這種情況下,應(yīng)用程序顯示用戶可以進(jìn)入系統(tǒng)的登錄頁(yè)面。進(jìn)入系統(tǒng)以后,應(yīng)用程序?qū)⒂脩糁囟ㄏ虻?protected1.jsp,它是用戶進(jìn)入系統(tǒng)而沒(méi)有請(qǐng)求特定的受保護(hù)資源時(shí)顯示的默認(rèn)資源。

      配置樣例應(yīng)用程序

      為本文下載的源代碼包含一個(gè)名為 acegi-config.xml 的 XML 配置文件,它包含 Acegi 過(guò)濾器的配置。根據(jù) 安全過(guò)濾器的討論 中的示例,您應(yīng)該很熟悉這些配置。

      我還為樣例應(yīng)用程序編寫(xiě)了一個(gè) web.xml 文件,如清單 8 所示:


      清單 8. 樣例應(yīng)用程序的 web.xml 文件
                              <web-app>
                              <context-param>
                              <param-name>contextConfigLocation</param-name>
                              <param-value>/WEB-INF/acegi-config.xml</param-value>
                              </context-param>
                              <filter>
                              <filter-name>Acegi Filter Chain Proxy</filter-name>
                              <filter-class>
                              org.acegisecurity.util.FilterToBeanProxy
                              </filter-class>
                              <init-param>
                              <param-name>targetClass</param-name>
                              <param-value>
                              org.acegisecurity.util.FilterChainProxy
                              </param-value>
                              </init-param>
                              </filter>
                              <filter-mapping>
                              <filter-name>Acegi Filter Chain Proxy</filter-name>
                              <url-pattern>/*</url-pattern>
                              </filter-mapping>
                              <listener>
                              <listener-class>
                              org.springframework.web.context.ContextLoaderListener
                              </listener-class>
                              </listener>
                              </web-app>
                              

      web.xml 文件配置如下:

      • acegi-config.xml 文件的 URL 位于 <context-param> 標(biāo)記中。

      • Acegi 過(guò)濾器鏈代理類的名稱位于 <filter> 標(biāo)記中。

      • URL 到 Acegi 過(guò)濾器鏈代理的映射在 <filter-mapping> 標(biāo)記中。注意:您可以簡(jiǎn)單地將應(yīng)用程序的所有 URL(/*)映射到 Acegi 過(guò)濾器鏈代理。Acegi 將對(duì)映射到 Acegi 過(guò)濾器鏈代理上的所有 URL 應(yīng)用安全性。

      • 應(yīng)用程序上下文加載程序位于 <listener> 標(biāo)記中,它將加載 Spring 的 IOC 框架。

      部署并運(yùn)行應(yīng)用程序

      部署并運(yùn)行樣例應(yīng)用程序非常的簡(jiǎn)單。只需要完成兩件事情:

      1. 將 acegisample.war 文件從本教程下載的源代碼中復(fù)制到安裝 Tomcat 的 webapps 目錄中。

      2. 從 Acegi Security System 主頁(yè) 下載并解壓縮 acegi-security-1.0.3.zip。您將找到一個(gè)名為 acegi-security-sample-tutorial.war 的樣例應(yīng)用程序。解壓縮 war 文件并提取其 WEB-INF/lib 文件夾中所有的 jar 文件。將所有的 JAR 文件從 WEB-INF/lib 文件夾中復(fù)制到 theacegisample.war 應(yīng)用程序的 WEB-INF/lib 文件夾。

      現(xiàn)在,您已經(jīng)為運(yùn)行樣例應(yīng)用程序做好準(zhǔn)備了。啟動(dòng) Tomcat 并將瀏覽器指向 http://localhost:8080/acegisample/。

      您將看到 圖 4 所示的歡迎頁(yè)面,但是此時(shí)顯示的頁(yè)面是真實(shí)的。請(qǐng)繼續(xù)運(yùn)行程序,并查看在嘗試訪問(wèn)歡迎頁(yè)面顯示的不同鏈接時(shí)會(huì)發(fā)生什么狀況。





      回頁(yè)首


      結(jié)束語(yǔ)

      使用 Acegi 保護(hù) Java 應(yīng)用程序 系列的第一篇文章中,您了解了 Acegi 安全系統(tǒng)的特性、架構(gòu)和組件,學(xué)習(xí)了大量有關(guān) Acegi 安全過(guò)濾器的知識(shí),這些過(guò)濾器被集成到 Acegi 的安全框架中。您還學(xué)習(xí)了如何使用 XML 配置文件配置組件依賴關(guān)系,并查看了 Acegi 的安全過(guò)濾器在樣例程序中工作的情形,該應(yīng)用程序可以實(shí)現(xiàn)基于 URL 的安全性。

      本文所述的安全技術(shù)非常的簡(jiǎn)單,所以 Acegi 使用這些技術(shù)實(shí)現(xiàn)安全性。本系列的下一文章將開(kāi)始介紹 Acegi 的一些較為高級(jí)的應(yīng)用,首先是編寫(xiě)訪問(wèn)控制協(xié)議并將其存儲(chǔ)到目錄服務(wù)中。您還將了解到如何配置 Acegi,使它與目錄服務(wù)交互,從而實(shí)現(xiàn)您的訪問(wèn)控制策略。







      下載

      描述 名字 大小 下載方法
      本文源代碼 j-acegi1.zip 10KB HTTP
      關(guān)于下載方法的信息


      參考資料

      學(xué)習(xí)

      獲得產(chǎn)品和技術(shù)

      討論


      關(guān)于作者

       

      Bilal Siddiqui 是一名電子工程師、XML 顧問(wèn),他還是 WaxSys(主要從事電子商務(wù)簡(jiǎn)化)的創(chuàng)建者之一。自從 1995 年畢業(yè)于拉合爾工程技術(shù)大學(xué)(University of Engineering and Technology,Lahore)電子工程專業(yè)以后,他就開(kāi)始為工業(yè)控制系統(tǒng)設(shè)計(jì)各種軟件解決方案。稍后,他致力于 XML 方面并使用他在 C++ 編程中取得的經(jīng)驗(yàn)來(lái)構(gòu)建基于 Web 和 WAP 的 XML 處理工具、服務(wù)器端解析方案和服務(wù)應(yīng)用程序。Bilal 是一名技術(shù)推廣者,并且是一名多產(chǎn)的技術(shù)作家。


        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多