2009-07-29 74 views
1

我試圖覆蓋Spring Security中的AuthenticationProcessingFilter。我已經做了以下配置中的XML:Spring的AuthenticationProcessingFilter覆蓋

<security:http access-decision-manager-ref="accessDecisionManager" > 
     <security:intercept-url .../> 
     <security:form-login login-page='/signin/' authentication-failure-url="/signin/?login_error" default-target-url='/signin/success'/> 
     <security:anonymous/> 
     <security:logout/> 
     <security:remember-me/> 
</security:http> 

<bean class="myPackage.security.SessionCleanerFilter" > 
    <security:custom-filter position="FILTER_SECURITY_INTERCEPTOR" /> 
    <property name="defaultTargetUrl" value="/signin/success" /> 
    <property name="authenticationFailureUrl" value="/signin/?login_error" /> 
    <property name="allowSessionCreation" value="true" /> 
</bean> 

但這種失敗有很多例外的

誤差名 創造豆 'myPackage.security.SessionCleanerFilter#0'

因缺乏instatiation屬性。我希望他們是默認的。你知道如何配置它們嗎?

回答

1

它不應該是:

<security:custom-filter position=「AUTHENTICATION_PROCESSING_FILTER」/> 
0

您還需要禁用自動配置:

<security:http auto-config="false" access-decision-manager-ref="accessDecisionManager"> 

,然後,你不再需要<security:form-login>標籤,因爲你設置相同你的bean中的屬性。

+0

`自動config`默認爲false,所以這不應該是必要的。 – 2011-12-14 12:25:14

0

您需要遵循的方法純粹取決於您在自定義過濾器中想要執行的操作。

我打了類似的問題,看看這個帖子的幾點建議https://stackoverflow.com/a/12356510/686478

security:form-login內部創建了AuthenticationProcessingFilter一個bean定義,因此在相同的位置,重新界定它(在你的情況下,其FORM_LOGIN_FILTER或AUTHENTICATION_PROCESSING_FILTER因爲它是所謂的2.x)會導致錯誤,因爲豆已經通過HTTP命名空間處理程序規定。請參閱參考手冊的Adding Your own filter部分。

容易的選擇是自動配置設置爲false,除去<form-login>並在預定的位置定義你的身份驗證過濾器,但這樣做,你也會鬆動可用性和安全配置的可讀性,你將不得不管理the dependencies of your AuthenticationProcessingFilter上你自己的(比如設置AuthenticationManager,filterProcessesUrl等)。

如果你真的不想覆蓋現有的認證過濾器,但實際上只是想做一些事前/事後處理,另一種方法是使用after或之前的屬性定義自定義過濾器,在實際過濾器之前或之後調用。

注:根據您的主題行,我想你是打算用AUTHENTICATION_PROCESSING_FILTER而不是FILTER_SECURITY_INTERCEPTOR這是FilterSecurityInterceptor別名。

我知道這是一種過時的帖子,但我希望這將有助於一些:)