這些天有點懶散, 想的也得振作一下吧. 從最好容易的部分下手, 這樣想到Acegi.前段時間的博客裡寫了acegi的最簡單配置, 以及圍繞這些簡單配置的一點點源碼層面的鑽研. 而實際項目中的配置光這些是不夠的, 比如說用戶信息及權限還有系統的訪問權限都是要放到數據庫裡的, 這樣在做用戶登錄與權限認證時就要hit數據庫了, 這方面的配置又怎樣呢?
不過這篇博客中打算寫與數據庫擴展相關的話題, 而是先從較為簡單的幾個Filter開刀.
先看LogoutFilter.
配置很簡單.
1, 先配置一個id為 logoutFilter的Bean, 如下所示:
<bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">
<constructor-arg value="/login.jsp" />
<constructor-arg>
<list>
<bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler" />
</list>
</constructor-arg>
</bean>
2, 把配置好的 logoutFilter加到 filterInvocationDefinitionSource中去, 即改為 "/**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor".
3, 在JSP中適當的位置加上 <a href="/myOwnAcegi/j_acegi_logout">退出</a>
幾點說明, 這個的配置很簡單的也多少要說有:
1, <constructor-arg value="/login.jsp" />的作用, 用來告訴Acegi當系統退出後跳轉到的鏈接.
2, LogoutFilter構造方法中的第二個參數的作用, 告訴Acegi系統退出後, 都有哪些跟退出相關的action要做.
3, j_acegi_logout的鏈接, 這個沒什麼, 跟登錄時的" j_acegi_security_check "類似, 都是Acegi自帶的, 大多情況下也沒什麼必要修改.
從追著源碼看了它的實現,沒什麼特殊的, 不過有如下幾個不太相關的問題:
1, 有沒有必要對這個退出單獨配置一個訪問時的filterChain, 即另加一個" /j_acegi_logout= httpSessionContextIntegrationFilter, logoutFilter "?如此配置的出發點是這樣的,上面配置2種的訪問鏈接在 logoutFilter之後還有三個filter要通過, 執行時間上有些浪費了, 通過這樣配置後, 當用戶點"退出"時acegi處理完 logoutFilter後就沒什麼filter要處理了.
再者說, 也不至於讓每一個請求都通過一次 logoutFilter,雖說 logoutFilter裡有這樣一個 requiresLogout判斷.
這樣的配置裡能不能不加 httpSessionContextIntegrationFilter? 為什麼要加呢? 不是很清楚.
後邊看到" sendRedirect(httpRequest, httpResponse, logoutSuccessUrl); "這樣的語句, 原來Acegi通過它就可以讓請求鏈接跳轉到
2, LogoutFilter的構造方法有兩個參數,String類型的 logoutSuccessUrl和 LogoutHandler[]類型的 handlers. 第一個參數沒啥可說的, 第一個參數, 人家要的類型是一個數組, 而Spring裡配置時是通過<list>標簽來的, Spring內部是怎麼轉化的? 這是個大話題, 先不再下鑽了.