Spring,无法在 Java 配置中更改 SessionAuthenticationStrategy

Posted

技术标签:

【中文标题】Spring,无法在 Java 配置中更改 SessionAuthenticationStrategy【英文标题】:Spring, can't change SessionAuthenticationStrategy in Java config 【发布时间】:2015-11-22 01:01:36 【问题描述】:

我想在 Spring-Boot 上禁用 session-fixation-protection(使用版本 1.2.4)。我们正在用 Java 配置 httpSecurity:

SecurityConfig.Scala

  override def configure(http: HttpSecurity): Unit = 
    println("loading config")
    http.
      csrf().disable().
      authorizeRequests().
      antMatchers("/api/member/**").permitAll().
      antMatchers("/api/feedback/submit").permitAll().
      antMatchers("/test/**").permitAll().
      antMatchers("/session").access("hasRole('ROLE_ADMIN')").
        anyRequest().anonymous().and().
      securityContext().securityContextRepository(memcachedSecurityContextRepository).and().
      formLogin().
        loginPage("/login").failureUrl("/denied").defaultSuccessUrl("/session").and().
      logout().invalidateHttpSession(true).logoutSuccessUrl("/login").and().
      sessionManagement().invalidSessionUrl("/login").maximumSessions(1).expiredUrl("/login").and().
      sessionFixation().none()
  

这是执行上述代码时来自 Spring 的一些调试:

加载配置

为 Ant 添加 Web 访问控制表达式“permitAll” [pattern='/api/member/**']

为 Ant 添加 Web 访问控制表达式“permitAll” [pattern='/api/feedback/submit']

为 Ant 添加 Web 访问控制表达式“permitAll” [pattern='/test/**']

为 Ant 添加 Web 访问控制表达式 'hasRole('ROLE_ADMIN')' [pattern='/session']

添加网络访问控制表达式“匿名”,用于 org.springframework.security.web.util.matcher.AnyRequestMatcher@1 已验证的配置属性

经过验证的配置属性

这里是验证时的调试输出:

COOKIEVAL:一些(mh3dg7l715nhvtfdfpng11ooa7)

/api/member/account 位于附加过滤器链中第 12 位的第 3 位; 触发过滤器:'HeaderWriterFilter'

不注入 HSTS 标头,因为它与 requestMatcher 不匹配 org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@4e2ca7d9

/api/member/account 位于附加过滤器链中第 12 位的第 4 位; 触发过滤器:'LogoutFilter'

检查请求的匹配:'/api/member/account';反对'/注销'

/api/member/account 位于附加过滤器链中第 12 位的第 5 位; 触发过滤器:'UsernamePasswordAuthenticationFilter'

检查请求的匹配:'/api/member/account';反对'/登录'

/api/member/account 位于附加过滤器链中第 12 位的第 6 位; 触发过滤器:'ConcurrentSessionFilter'

/api/member/account 位于附加过滤器链中第 12 位的第 7 位; 触发过滤器:'RequestCacheAwareFilter'

/api/member/account 位于附加过滤器链中第 12 位的第 8 位; 触发过滤器:'SecurityContextHolderAwareRequestFilter'

/api/member/account 在附加过滤器链中的第 12 位中的第 9 位; 触发过滤器:'AnonymousAuthenticationFilter'

SecurityContextHolder 未填充匿名令牌,因为它 已经包含: 'org.springframework.security.authentication.UsernamePasswordAuthenticationToken@4525caad: 校长:org.springframework.security.core.userdetails.User@586034f: 用户名:admin;密码保护];启用:真; AccountNonExpired:真;凭据非过期:真; AccountNonLocked:真;授予权限:ROLE_ADMIN;证书: [受保护];已认证:真实;详细信息:空;授予权限: ROLE_ADMIN'

/api/member/account 位于附加过滤器链中第 12 位的第 10 位; 触发过滤器:'SessionManagementFilter'

/api/member/account 位于附加过滤器链中第 12 位的第 11 位; 触发过滤器:'ExceptionTranslationFilter'

/api/member/account 位于附加过滤器链中第 12 位的第 12 位; 触发过滤器:'FilterSecurityInterceptor'

检查请求的匹配:'/api/member/account';反对 '/api/member/**'

安全对象:FilterInvocation:URL:/api/member/account;属性: [全部允许]

先前已通过身份验证: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@4525caad: 校长:org.springframework.security.core.userdetails.User@586034f: 用户名:admin;密码保护];启用:真; AccountNonExpired:真;凭据非过期:真; AccountNonLocked:真;授予权限:ROLE_ADMIN;证书: [受保护];已认证:真实;详细信息:空;授予权限: ROLE_ADMIN

选民: org.springframework.security.web.access.expression.WebExpressionVoter@28549e18, 返回:1

授权成功

RunAsManager 没有改变 Authentication 对象

/api/member/account 到达附加过滤器链的末尾;进行中 带原链

我必须做些什么来防止 cookie 值在身份验证后被更改?我认为调用 sessionFixation().none() 会关闭会话固定保护。

【问题讨论】:

【参考方案1】:

就我而言,这有帮助:

http
  .sessionManagement()
    .sessionAuthenticationStrategy(new NullAuthenticatedSessionStrategy()).and()
  ....

NullAuthenticatedSessionStrategy 不会对身份验证做任何事情。

这样做是不安全的! 这仅用于测试目的!

【讨论】:

以上是关于Spring,无法在 Java 配置中更改 SessionAuthenticationStrategy的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 play framework 1.x 和 Amazon SES 发送电子邮件?

使用SQS接收SES消息

Spring引导多个gradle项目依赖管理->无法更改配置的依赖关系

Java Android Badge Drawable 在配置更改后无法正常工作

使用 Amazon SES 和 Spring Boot 发送电子邮件

无法使用 python SDK 在 ECS fargate 作业上发送邮件,并在另一个 aws 帐户中使用经过验证的 SES 的凭据