我想使用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未经授权。我的配置中缺少一些东西,我不知道是什么。
1条答案
按热度按时间nhjlsmyf1#
Spring默认存储身份验证详细信息的HttpSession。因此,无论何时用户登录并且身份验证成功,详细信息都存储在ThreadLocal中,并且无论何时发生下一次登录,它都会从安全上下文中获取它,而不是再次进行身份验证。Spring Security为会话管理提供了多个策略。对于您的用例,您需要使用SessionCreationPolicy.STATELESS配置HttpSecurity。
您也可以参考以下文章了解详细信息:https://www.javadevjournal.com/spring-security/spring-security-session/