2013-07-10 77 views
3

我已經實現映射到特定URL的自定義安全機制「/合作伙伴/登錄」,我用我自己的子類AbstractAuthenticationProcessingFilter產生一個subclassed AbstractAuthenticationTokenAuthenticationProvider的實現進行身份驗證。在成功時,我會撥打SimpleUrlAuthenticationSuccessHandler,它將嘗試重定向到「/ UserProfile」。 此「/ partner/login」處理來自我們的某個合作伙伴的SSO請求。而在開發過程中,我們的內部登錄過程使用Spring Security的默認登錄形式進行模擬,這就是爲什麼auto-config是真實的。春季安全SecurityContextHolder.getContext()。getAuthentication()返回null

起初,我用的是folllowing(春季安全)配置的發展:

<http auto-config="true"> 
    <intercept-url pattern="/**/*.jsp" access="ROLE_USER, ROLE_PARTNER_USER"/> 
    <custom-filter after = "FORM_LOGIN_FILTER" ref = "partnerSsoAuthFilter"/> 
</http> 

現在這工作正常,我也得到通過SecurityContextHolder Authentication對象,我rediirected後的「/UserProfile「

一旦我在使用自定義過濾器鏈圖的生產(彈簧安全性)配置中使用這些問題,問題就會出現。 (我們使用CAS在生產我們自己的登錄)

<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy"> 
    <sec:filter-chain-map path-type="ant"> 
     <sec:filter-chain pattern="/partner/login" filters="sif,partnerSsoAuthFilter,etfPartner,fsi" /> 
     <sec:filter-chain pattern="/" filters="casValidationFilter, wrappingFilter" />** 
     <sec:filter-chain pattern="/secure/receptor" filters="casValidationFilter" /> 
     <sec:filter-chain pattern="/j_spring_security_logout" filters="logoutFilter,etf,fsi" /> 
     ***More filters*** 
    </sec:filter-chain-map> 
</bean> 

這裏SIF,ETF,FSI是正規SecurityContextPersistenceFilter,和的ExceptionTranslationFilter FilterSecurityInterceptor。

使用此配置時,重定向到「/ UserDetails」SecurityContextHolder.getContext()。getAuthentication()返回null,但我仍然可以訪問放置在會話中的認證對象。

我對這種行爲感到困惑。在這兩種情況下,我都使用相同的自定義過濾器/提供程序/令牌等來實現「/ partner/login」。 爲什麼在一種情況下getAuthentication()不爲空,而在另一箇中它是空的? 任何幫助將是偉大的。 TIA。

+0

您使用的是哪個版本的Spring Security? –

+0

Spring Security版本是3.1.1 –

+0

您是否曾經解決過這個問題?請分享你的解決方案.. – aProgrammer

回答

1

我有一個想法,但我不確定(我沒有與SS + CAS任何expiriance,我不喜歡在conf中手動聲明SS過濾器)。我知道有一個SecurityContextPersistenceFilter負責填充SecurityContextHolder。請檢查它是否在你的開發配置中被解僱?如果它被解僱,請檢查您的生產環境相同的東西。希望這可以幫助。

+0

是在這兩種情況下,在觸發SimpleUrlAuthenticationSuccessHandler#handle()之後觸發SecurityContextPersistenceFilter#doFilter()。 –

+0

如果我告訴SecurityContextPersistenceFilter在響應代碼爲302時不清除上下文,該怎麼辦? –

+0

我沒有看到任何區別。無論如何,它將在下一次請求開始時填充。 –