我实现了一个自定义的安全机制,映射到一个特定的url“/partner/login”,在这里我使用自己的子类abstractauthenticationprocessingfilter生成一个子类abstractauthenticationtoken,该子类由authenticationprovider的实现进行身份验证。成功时,我调用一个SimpleUrlauthenticationSuccessHandler,它将尝试重定向到“/userProfile”。
这个“/partner/login”处理来自我们的一个合作伙伴的sso请求。而在开发过程中,我们的内部登录过程是使用spring security的默认登录形式模拟的,这就是auto-config为真的原因。
最初,我使用以下(spring security)配置进行开发:
<http auto-config="true">
<intercept-url pattern="/**/*.jsp" access="ROLE_USER, ROLE_PARTNER_USER"/>
<custom-filter after = "FORM_LOGIN_FILTER" ref = "partnerSsoAuthFilter"/>
</http>
现在这可以按预期工作了,我在重新定向到“/userprofile”之后从SecurityContextHolder获取身份验证对象
当我在使用自定义过滤器链映射的生产(spring security)配置中使用这些配置时,问题就开始了。(我们在生产中使用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()时返回空值,但我仍然可以访问会话中放置的身份验证对象。
我对这种行为感到困惑。我在两种情况下都为“/partner/login”使用相同的自定义筛选器/提供程序/令牌等。
为什么在一种情况下getAuthentication()不为空,而在另一种情况下为空?
任何帮助都很好。
蒂亚。
最佳答案
我有一个想法,但我一点也不确定(我没有任何与ss+cas的过期,我不喜欢在conf中手动声明ss过滤器)。我知道有一个SecurityContextPersistenceFilter
负责填充SecurityContextHolder。请检查您的开发配置中是否触发了它?如果它被触发了,请为您的生产环境检查相同的东西。希望这有帮助。