java—为什么在spring boot中使用自定义安全过滤器时,登录后jsessionid不会更改?

i2loujxw  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(600)

我注意到,当使用自定义安全过滤器登录后,jsessionid不会改变。

@Override
  protected void configure(HttpSecurity http) throws Exception {
    http
      .addFilterBefore(authenticationFilter(), UsernamePasswordAuthenticationFilter.class)
      .authorizeRequests()
      .antMatchers("/", "/home").permitAll()
      .anyRequest().authenticated()
      .and()
      .formLogin()
      .loginPage("/login")
      .permitAll()
      .and()
      .logout()
      .permitAll();
  }

  public UsernamePasswordAuthenticationFilter authenticationFilter() throws Exception {
    CustomFilter customFilter = new CustomFilter();
    customFilter.setAuthenticationManager(authenticationManagerBean());
    return customFilter;
  }

即使我把 sessionManagement().sessionFixation().newSession() 但当我删除自定义过滤器时,jesessionid确实会在每次登录和注销时重新设置。
有人知道为什么吗?我想了解。
自定义筛选器具有相同的实现 UsernamePasswordAuthenticationFilter ```
public class CustomFilter extends UsernamePasswordAuthenticationFilter {

public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
if (!request.getMethod().equals("POST")) {
throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
} else {
String username = this.obtainUsername(request);
String password = this.obtainPassword(request);
if (username == null) {
username = "";
}

  if (password == null) {
    password = "";
  }

  username = username.trim();
  UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
  this.setDetails(request, authRequest);
  return this.getAuthenticationManager().authenticate(authRequest);
}

}

}

我根据本指南构建了一个简单的项目:https://spring.io/guides/gs/securing-web/
qgelzfjb

qgelzfjb1#

简单的回答是默认的 SessionAuthenticationStrategy 在里面 UsernamePasswordAuthenticationFilter 是一个 NullAuthenticatedSessionStrategy .
通过简单地扩展 UsernamePasswordAuthenticationFilter 在创建新示例时,自定义筛选器将使用 NullAuthenticatedSessionStrategy .
当spring security创建 UsernamePasswordAuthenticationFilter 从表单登录配置中,它设置 SessionAuthenticationStrategy 到中配置的策略 HttpSecurity ,默认为 ChangeSessionIdAuthenticationStrategy .
如果您跟踪代码,您可以看到这是如何发生的。
配置时 http.formLogin() SpringSecurity创建了一个 FormLoginConfigurer 延伸 AbstractAuthenticationFilterConfigurer .
这个 FormLoginConfigurer 构造函数创建的新示例 UsernamePasswordAuthenticationFilter .
后来,当 configure 方法在 FormLoginConfigurer ,您会注意到过滤器上设置了各种属性,其中之一是 SessionAuthenticationStrategy .

SessionAuthenticationStrategy sessionAuthenticationStrategy = http
        .getSharedObject(SessionAuthenticationStrategy.class);
if (sessionAuthenticationStrategy != null) {
    this.authFilter.setSessionAuthenticationStrategy(sessionAuthenticationStrategy);
}

如果你看 SessionManagementConfigurer ,您会注意到默认策略是 ChangeSessionIdAuthenticationStrategy .
这个 SessionAuthenticationStrategy#onAuthentication 后来在 doFilter 方法 UsernamePasswordAuthenticationFilter .
这就是为什么spring security配置的过滤器在登录后会更改会话id,而没有设置属性的过滤器的新示例不会更改会话id的原因。

相关问题