Spring会话 - 重定向到目标网址

时间:2016-10-21 10:07:13

标签: spring spring-mvc spring-security

我正在使用带有淡淡的弹簧和弹簧安全性的春季会议。我面临的问题是Spring安全无法从httpsession加载安全上下文。在身份验证期间,我可以在以下代码中看到安全上下文设置为session:

if (contextChanged(context)||  httpSession.getAttribute(springSecurityContextKey) == null) {
  httpSession.setAttribute(springSecurityContextKey, context);
  if (logger.isDebugEnabled()) {
    logger.debug("SecurityContext '" + context
                + "' stored to HttpSession: '" + httpSession);
    }
}

但是在Spring重定向到目标url之后的身份验证之后,它无法从以下代码中的会话中获取安全上下文:

Object contextFromSession = httpSession.getAttribute(springSecurityContextKey);

if (contextFromSession == null) {

  if (debug) {
    logger.debug("HttpSession returned null object for SPRING_SECURITY_CONTEXT");
  }
  return null;
}

知道这里有什么问题吗? 安全调试日志 -

w.a.s.SessionFixationProtectionStrategy:开始新会话:2192be54-aee1-4249-98ba-01a65a401830 c.i.i.w.s.LoggingSecurityEventListener:event = SessionFixationProtectionEvent username = cgrant remoteAddress = 0:0:0:0:0:0:0:1 sessionId = c7363d39-28ff-44e3-83a9-d463f2f371e5 w.a.UsernamePasswordAuthenticationFilter:身份验证成功。更新SecurityContextHolder以包含:org.springframework.security.authentication.UsernamePasswordAuthenticationToken@5e87c6c5:Principal:org.springframework.security.core.userdetails。 c.i.i.w.s.LoggingSecurityEventListener:event = InteractiveAuthenticationSuccessEvent username = cgrant remoteAddress = 0:0:0:0:0:0:0:1 sessionId = c7363d39-28ff-44e3-83a9-d463f2f371e5 RequestAwareAuthenticationSuccessHandler:使用默认URL:/ o.s.s.web.DefaultRedirectStrategy:重定向到' / myapp /' wcHttpSessionSecurityContextRepository:SecurityContext' org.springframework.security.core.context.SecurityContextImpl@5e87c6c5:身份验证:org.springframework.security.authentication.UsernamePasswordAuthenticationToken@5e87c6c5:Principal:org.springframework.security.core.userdetails.User @ fb03e089:用户名:cgrant; ..........存储到HttpSession:' org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper$HttpSessionWrapper@5d2baa59 s.s.w.c.SecurityContextPersistenceFilter:SecurityContextHolder现已清除,因为请求处理已完成 o.s.s.w.s.HttpSessionEventPublisher:发布事件:org.springframework.security.web.session.HttpSessionCreatedEvent [source =org.springframework.session.web.http.ExpiringSessionHttpSession@287a471f] ..... ..... o.s.security.web.FilterChainProxy:/在附加过滤器链中的位置1的11;触发过滤器:' WebAsyncManagerIntegrationFilter' o.s.security.web.FilterChainProxy:/位于第2位的11位于额外的过滤链中;触发过滤器:' SecurityContextPersistenceFilter' w.c.HttpSessionSecurityContextRepository:HttpSession为SPRING_SECURITY_CONTEXT返回了null对象 w.c.HttpSessionSecurityContextRepository:没有来自HttpSession的SecurityContext:org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper$HttpSessionWrapper@8d3c315。将创建一个新的。 o.s.security.web.FilterChainProxy:/在第3位,共11个附加过滤链;触发过滤器:' HeaderWriterFilter' o.s.s.w.header.writers.HstsHeaderWriter:没有注入HSTS头,因为它与requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter $ SecureRequestMatcher@57f4e063不匹配 o.s.security.web.FilterChainProxy:/在第4位的11位额外的过滤链中;触发过滤器:' LogoutFilter' o.s.s.w.u.matcher.AntPathRequestMatcher:检查请求的匹配:' /&#39 ;;反对' /注销' o.s.security.web.FilterChainProxy:/在第5位,共11个附加过滤链;触发过滤器:' UsernamePasswordAuthenticationFilter' o.s.s.w.u.matcher.AntPathRequestMatcher:请求' GET /'没有匹配' POST / login / auth o.s.security.web.FilterChainProxy:/在第6位的11位于额外的过滤链中;触发过滤器:' RequestCacheAwareFilter' o.s.security.web.FilterChainProxy:/在第7位,共11个附加过滤链;触发过滤器:' SecurityContextHolderAwareRequestFilter' o.s.security.web.FilterChainProxy:/在第8位的11位额外的过滤链中;触发过滤器:' AnonymousAuthenticationFilter' o.s.s.w.a.AnonymousAuthenticationFilter:带有匿名标记的填充SecurityContextHolder:' org.springframework.security.authentication.AnonymousAuthenticationToken@6fa843a8:Principal:anonymousUser;证书:[保护];认证:真实;详细信息:org.springframework.security.web.authentication.WebAuthenticationDetails@fffd3270:RemoteIpAddress:0:0:0:0:0:0:0:1; SessionId:2192be54-aee1-4249-98ba-01a65a401830;授权机构:ROLE_ANONYMOUS' o.s.security.web.FilterChainProxy:/在第9位,共11个额外的过滤链;触发过滤器:' SessionManagementFilter' o.s.security.web.FilterChainProxy:/在第10位的11位于额外的过滤链中;触发过滤器:' ExceptionTranslationFilter' o.s.security.web.FilterChainProxy:/在11位11的附加过滤链中;触发过滤器:' FilterSecurityInterceptor' ..... ..... o.s.s.w.a.i.FilterSecurityInterceptor:安全对象:FilterInvocation:URL:/;属性:[已验证] o.s.s.w.a.i.FilterSecurityInterceptor:以前经过身份验证:org.springframework.security.authentication.AnonymousAuthenticationToken@6fa843a8:Principal:anonymousUser;证书:[保护];认证:真实;详细信息:org.springframework.security.web.authentication.WebAuthenticationDetails@fffd3270:RemoteIpAddress:0:0:0:0:0:0:0:1; SessionId:2192be54-aee1-4249-98ba-01a65a401830;授权机构:ROLE_ANONYMOUS o.s.s.access.vote.AffirmativeBased:选民:org.springframework.security.web.access.expression.WebExpressionVoter@1023c8f1,返回:-1 o.s.s.w.a.ExceptionTranslationFilter:访问被拒绝(用户是匿名的);重定向到身份验证入口点

3 个答案:

答案 0 :(得分:2)

我找到了这个问题的实际原因。我使用的是Spring-session-1.2.2和hazelcast-3.5.4。迁移后,Spring会话无法保存会话。我不知道它是否是淡褐色问题或春季会议问题。 出于测试目的,我使用了MapSessionRepository和@EnableSpringHttpSession,一切正常。 在调试spring-session库时遇到了痛苦的经历,根据我的经验,我建议在使用任何存储进行会话复制之前先使用MapSessionRepository进行测试,这样可以确保您的应用程序配置与spring-session一起使用,之后转移到使用第三方会话存储库。

答案 1 :(得分:1)

成功进行身份验证后,Spring Security会破坏上一个会话,并创建一个认证设置为true的新会话。

因此,您在身份验证之前放入Session的Context Object在身份验证后将无法使用,因为之前的会话将被销毁。

此策略称为会话修复。您可以Read Here了解更多相关信息。

因此,如果您想在身份验证后获取Context,请使用:

Object contextObject = org.springframework.security.core.context.SecurityContextHolder.getContext();

web.xml中的Spring安全链过滤器:

    <filter-mapping>
      <filter-name>springSecurityFilterChain</filter-name>
      <url-pattern>/*</url-pattern>
      <dispatcher>REQUEST</dispatcher>
      <dispatcher>FORWARD</dispatcher>
    </filter-mapping>

答案 2 :(得分:0)

对于Chrome,您可以在设置->内容设置-> Cookies->允许网站保存和读取Cookie数据(推荐)中查看cookie设置