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 发送电子邮件?
Spring引导多个gradle项目依赖管理->无法更改配置的依赖关系
Java Android Badge Drawable 在配置更改后无法正常工作
使用 Amazon SES 和 Spring Boot 发送电子邮件
无法使用 python SDK 在 ECS fargate 作业上发送邮件,并在另一个 aws 帐户中使用经过验证的 SES 的凭据