Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Security SecurityContextHolder.getContext().getAuthentication()返回null_Java_Spring_Spring Security_Servlet Filters - Fatal编程技术网

Java Spring Security SecurityContextHolder.getContext().getAuthentication()返回null

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”

我已经实现了一个定制的安全机制,映射到一个特定的URL“/partner/login”我使用自己的子类AbstractAuthenticationProcessingFilter生成子类AbstractAuthenticationToken,该子类AbstractAuthenticationToken由AuthenticationProvider实现进行身份验证。成功后,我调用一个SimpleLauthenticationSuccessHandler,它将尝试重定向到“/UserProfile”。 此“/partner/login”处理来自我们合作伙伴之一的SSO请求。而在开发中,我们的内部登录过程是使用SpringSecurity的默认登录形式模拟的,这就是为什么AutoConfig是正确的

最初,我使用以下(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进行自己的登录)


**
***更多过滤器***
这里,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>