程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Acegi(四):Acegi初體驗及初解剖

Acegi(四):Acegi初體驗及初解剖

編輯:關於JAVA

上篇博客中,我們以靜態地角度對Acegi的核心概念及其實現上的核心部件進行了談討,本這篇中,我們將結合一個Web程序來體會並介紹下在Web項目中配置Acegi裡都有哪些關鍵點。

我們知道Acegi可以多種實用場景,但現在用的最多的還是在Web項目中,這裡不再介紹配置的具體步驟,直接將一個配置好的Web項目傳了上來(只做了那些必要的配置),見附件,不出意外的話,這個例子可以在Eclipse裡直接運行,Eclipse版本為3.4.0。

下面的介紹都是以這個Web例子為介紹的, 大家最好先把例子下載下來體會下, 先大致地看下web.xml和application_acegi_context.xml這兩個文件的內容, 以對Acegi的配置有個直觀的印象.

咱們從web.xml文件開始.

我們看到這個文件特簡單, 一共就context-param,filter,filter-mapping,listener,welcome-file-list五個配置元素. 先從最熟悉的配置元素逐個排除.第一個 welcome- file-list不必多說, 排除掉. 再看listener,由於Acegi是建立在Spring框架上的, 這裡通過listener來初始化Spring的Context是情理之中的, 也就不必再多考慮. 有了listener的理解基礎,我們再看context-param也就明白了,這個元素把Acegi的配置文件 applicationContext-acegi-security.xml 提供給Spring.下面進入Acegi在Web應用中的關鍵部件Filter, 我們知道Acegi在Web應用方面的一個基本原理就是Servlet的Filter,這裡配置中Filter實現類是 FilterToBeanProxy, 它有一個配置參數targetClass,其值為 FilterChainProxy, 這個Filter的配置很簡單, 大多數 情況下我們可以直接從現有的例子中拷來就行, 很少需要做什麼配置上的改動.不過,若想把Acegi工作原理及其工作細節搞明白的話,這個FilterToBeanProxy到 FilterChainProxy的轉換是不能躲過的關鍵點,再進一步想, 看人家是怎麼設計實現的對自己的"錢途"也是大有幫助的吧?從我自身的體會上來看, FilterToBeanProxy和 FilterChainProxy兩個類在設計上很有"嚼頭",我想著在另外的博客中單獨來看它們的實現與給自己的啟發, 這裡我們先有這樣的一個概念: FilterToBeanProxy在 doFilter時會從Spring的Context裡get出 FilterChainProxy的實例, FilterChainProxy自身也是一個Filter的實現類,它在 applicationContext-acegi-security.xml文件中初始化, 這樣, FilterToBeanProxy就把經過它的所有請求轉給了 FilterChainProxy來處理, 這樣就上了Acegi的道兒,也就是攔截下來的請求在真正做事前需得到Acegi的許可.

下面我們來看 applicationContext-acegi-security.xml文件,上面的分析我們得出,   FilterToBeanProxy把攔截下的請求交給了 FilterChainProxy來處理, 這個處理就是Acegi的核心概念Authentication和Authorization的實現.

在這個文件中我們首先看到如下的配置信息:

<bean id="filterChainProxy"
class="org.acegisecurity.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/login.jsp=#NONE#
/**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor
</value>
</property>
</bean>

在上面介紹 web.xml文件內容時,我們提到FilterToBeanProxy從Spring的Contextget出 FilterToBeanProxy的實例,上面的配置信息讓Spring來初始化 FilterChainProxy 類,隨便說下, 這裡 FilterChainProxy實現的id沒有用到,再進一步想,Spring可以不用id再用類名就可以得到其實例.回到正題, FilterChainProxy類有一個名為 filterInvocationDefinitionSource 的屬性, 通過這個屬性, Acegi把攔截下來的請求再一次轉移.

我們先看 filterInvocationDefinitionSource屬性裡又都有些什麼?從上面我們看到, value裡是一些字符串描述的信息,這裡有一個與當前Acegi不相干的思考: setFilterInvocationDefinitionSource方法的參數類型是 FilterInvocationDefinitionSource,Spring是怎麼把一個String類型的信息自動轉成所需要的 FilterInvocationDefinitionSource類型的呢?這個問題在這裡先不思考.回到正題, 屬性 filterInvocationDefinitionSource裡配置的關鍵信息是" /**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor ", 從下面的配置可以看出, httpSessionContextIntegrationFilter,authenticationProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor 幾個Bean都是Filter接口的實現類,這幾個Filter的實現類再調用上一篇博客裡提到的"七劍" 實現Authentication和Authoriaztion的"理想".

那"七劍"是怎麼與" httpSessionContextIntegrationFilter,authenticationProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor "們配置的的呢?且看下回.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved