java - 在 HTTPS/SSL 中使用 RedirectView 后 Spring 的 SecurityContextHolder.getContext().getAuthentication() 返回 null

标签 java spring tomcat https spring-security

我有一个典型的 Spring MVC 在 Tomcat 上运行。将系统切换为在 HTTPS 上运行(在纯 HTTP 下一切正常)后,登录停止工作。原因是Spring的SecurityContextHolder.getContext().getAuthentication()对象在使用RedirectView后变成了null

我已经搜索过答案,我发现的唯一一个建议在 viewResolver bean 设置中将属性 redirectHttp10Compatible 设置为 false。这没有帮助。

我还检查了在整个重定向过程中,我的 session ID 保持不变并且连接保持安全,即它不是 http 和 https 之间的更改(至少据我所知)的问题,反之亦然。

可能是什么问题?

<beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">


  <http auto-config="true">
    <intercept-url pattern="/**" requires-channel="https" />

    <intercept-url pattern="/index*" access="ROLE_USER"/>


    <intercept-url pattern="/dashboard*" access="ROLE_USER" requires-channel="https"/>  

    <intercept-url pattern="/login*" access="ROLE_GUEST, ROLE_ANONYMOUS, ROLE_USER"/>
    <intercept-url pattern="/signin*" access="ROLE_GUEST, ROLE_ANONYMOUS, ROLE_USER"/>
    <intercept-url pattern="/signup*" access="ROLE_GUEST, ROLE_ANONYMOUS, ROLE_USER"/>    


    <form-login login-page="/home" 
                default-target-url="/home" 
                authentication-failure-url="/home?authentication_error=true"
                authentication-success-handler-ref="redefineTargetURL"
    />


    <anonymous username="guest" granted-authority="ROLE_GUEST" key="anonymousKey"/>
    <logout invalidate-session="true" logout-success-url="/logout?message=Logout Successful" />

    </http>



<authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="userDetailsService" />
</authentication-manager>


<beans:bean id="redefineTargetURL" class="com.groupskeed.common.RedefineTargetURL" />
<beans:bean id="userDetailsService" class="com.groupskeed.security.UserDetailsServiceImpl" />

最佳答案

SecurityContextHolder.getContext().getAuthentication() 在重定向后变为空是正确的,因为它是线程绑定(bind)的。但它应该从 session 中重新填充。因此尝试跟踪 session 中的 SPRING_SECURITY_CONTEXT 属性。下面是一些示例代码来获得一个想法:

HttpSession session = request.getSession(true);
System.out.println(session.getAttribute("SPRING_SECURITY_CONTEXT"));

在 Spring Security 文档中,有一部分是关于 HTTPS/HTTP 切换如何搞砸 session 的,也许其中某处暗示了您的问题。 http://static.springsource.org/spring-security/site/faq.html#d0e223

上面的常见问题解答导致对 session 在您的应用程序中的处理方式进行检查。 我可能会开始研究 AuthenticationSuccessHandler 实现。 (如果您愿意,可以将其发布到您的问题中。)

有关如何在 Web 应用程序中处理安全上下文的更多详细信息,请参阅以下内容:(section 5.4 Authentication in a Web Application):http://static.springsource.org/spring-security/site/docs/3.0.x/reference/technical-overview.html

关于java - 在 HTTPS/SSL 中使用 RedirectView 后 Spring 的 SecurityContextHolder.getContext().getAuthentication() 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16952718/

相关文章:

spring - Web 应用程序的 100% 正常运行时间

java - 来自 Admob 的 Android list 错误

spring - 调用 j_spring_security_logout 不起作用

java - jax-ws 服务中的 "Operation Connection.commit is not allowed during a global transaction"

Spring Boot如何在没有注释的情况下设置过滤器的顺序

java - 仅在不使用 sysout 时才延迟初始化角色集合失败

angularjs - 在本地 tomcat 上运行 AngularJS 编码的基本应用程序无法正常工作

JAVA VM 内存选项 32bit 小于 2g 不工作

java - Websocket 在打开后关闭连接

java - 将输入密码与网络应用程序中存储的散列密码进行比较