Java Spring Security SecurityContextHolder.getContext().getAuthentication()返回null
我已经实现了一个定制的安全机制,映射到一个特定的URL“/partner/login”我使用自己的子类AbstractAuthenticationProcessingFilter生成子类AbstractAuthenticationToken,该子类AbstractAuthenticationToken由AuthenticationProvider实现进行身份验证。成功后,我调用一个SimpleLauthenticationSuccessHandler,它将尝试重定向到“/UserProfile”。 此“/partner/login”处理来自我们合作伙伴之一的SSO请求。而在开发中,我们的内部登录过程是使用SpringSecurity的默认登录形式模拟的,这就是为什么AutoConfig是正确的 最初,我使用以下(spring security)配置进行开发:Java Spring Security SecurityContextHolder.getContext().getAuthentication()返回null,java,spring,spring-security,servlet-filters,Java,Spring,Spring Security,Servlet Filters,我已经实现了一个定制的安全机制,映射到一个特定的URL“/partner/login”我使用自己的子类AbstractAuthenticationProcessingFilter生成子类AbstractAuthenticationToken,该子类AbstractAuthenticationToken由AuthenticationProvider实现进行身份验证。成功后,我调用一个SimpleLauthenticationSuccessHandler,它将尝试重定向到“/UserProfile”
<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进行自己的登录)
**
***更多过滤器***
这里,sif、etf、fsi是常规SecurityContextPersistenceFilter、ExceptionTranslationFilter和FilterSecurityInterceptor
使用此配置,当重定向到“/UserDetails”SecurityContextHolder.getContext()时,getAuthentication()返回null,但我仍然可以访问会话中放置的身份验证对象
我对这种行为感到困惑。在这两种情况下,我对“/partner/login”使用相同的自定义过滤器/提供者/令牌等。
为什么getAuthentication()在一种情况下不为null,而在另一种情况下为null?
任何帮助都会很好。
TIA.我有一个想法,但我一点也不确定(我对SS+CAS没有任何过期性,我不喜欢在conf中手动声明SS过滤器)。我知道有一个负责填充SecurityContextHolder的
SecurityContextPersistenceFilter
。请检查它是否在您的开发配置中触发?如果它被触发,请为您的生产环境检查相同的内容。希望这能有所帮助。您使用的是哪个版本的Spring Security?Spring Security版本是3.1.1您解决过这个问题吗?请分享您的解决方案。是的,在这两种情况下,SecurityContextPersistenceFilter#doFilter()都是在SimpleLauthenticationSuccessHandler#handle()被激发后激发的。如果我告诉SecurityContextPersistenceFilter在响应代码为302时不要清除上下文会怎么样?我看不出有任何区别。无论如何,它将在下一个请求开始时填充。
<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>