Spring Security 内存身份验证中的Spring安全性在第一次身份验证后接受任何密码

yyyllmsg  于 2022-11-29  发布在  Spring
关注(0)|答案(1)|浏览(125)

我想使用spring security InMemoryUserDetailsManager为基本身份验证添加简单配置
添加以下配置后,我可以使用内存中的用户(myUser)和此用户的密码进行身份验证:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf()
        .disable()
        .authorizeRequests()
        .anyRequest()
        .authenticated()
        .and()
        .httpBasic();
  }

  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(inMemoryUserDetailsManager());
  }

  @Bean
  public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
    List<UserDetails> userDetailsList = new ArrayList<>();
    userDetailsList.add(User.withUsername("myUser").password(passwordEncoder().encode("password"))
        .roles("USER").build());

    return new InMemoryUserDetailsManager(userDetailsList);
  }

  @Bean
  public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
  }
}

问题是,如果我从postman更改密码,我仍然能够进行身份验证。如果我停止应用程序服务器,并再次启动应用程序,并尝试使用错误的密码和正确的用户名,它返回401(这是预期的)。但是,如果发送的下一个请求具有包含用户名和密码的正确标头,(我的用户,密码),然后发送请求后,与错误的密码,似乎错误的密码被接受。只要我改变用户名为一些随机字,它返回401未经授权。我的配置中缺少一些东西,我不知道是什么。

nhjlsmyf

nhjlsmyf1#

Spring默认存储身份验证详细信息的HttpSession。因此,无论何时用户登录并且身份验证成功,详细信息都存储在ThreadLocal中,并且无论何时发生下一次登录,它都会从安全上下文中获取它,而不是再次进行身份验证。Spring Security为会话管理提供了多个策略。对于您的用例,您需要使用SessionCreationPolicy.STATELESS配置HttpSecurity。

http
            .csrf()
            .disable()
            .authorizeRequests()
            .anyRequest()
            .authenticated()
            .and()
            .httpBasic()
            .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)

您也可以参考以下文章了解详细信息:https://www.javadevjournal.com/spring-security/spring-security-session/

相关问题