Spring 安全基本身份验证密码轮换问题
Spring Security Basic Auth Password Rotation Issue
专家,
我有一个 spring 引导 2.5.5 应用程序(嵌入式 tomcat),我必须在其中配置基本身份验证。
这是我拥有的 class 可以为我工作的
@Component
@EnableWebSecurity
public class ApplicationSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.httpBasic();
}
}
问题是我只需要在浏览器中输入一次 user/password 就可以处理任何后续请求。此外,我不需要在服务器重新启动后提供新的 username/password 这让我发疯 - 该应用程序仍然有效,我可以访问我的 APIs/pages.
即使我假设浏览器以某种方式保存用户名和密码,一旦服务器重新启动后密码被更改,它也不应该工作 - 不是吗?
更新二:
遵循 M 的建议。 Deinum 我使会话无状态并且有效。然后我继续使用 InMemoryUserDetailsManager 实现 Basic Auth 并添加了下面的代码,我们又回到了同样的问题。凭据似乎再次存储在会话中,我不需要为后续请求传递它们。
@Autowired
public ApplicationSecurityConfig(PasswordEncoder passwordEncoder) {
this.passwordEncoder = passwordEncoder;
}
@Override
@Bean
protected UserDetailsService userDetailsService() {
UserDetails user = User
.builder()
.username("admin")
.password(passwordEncoder.encode("admin"))
.roles("ADMINISTRATOR")
.build();
return new InMemoryUserDetailsManager(user);
}
这就是我希望它与您当前的配置一起工作的方式。
当通过基本身份验证成功验证时,浏览器将为所有其他后续请求发送 username/password。所以这符合预期。
另一件事是,默认情况下,Spring Security 将使用HTTP Session 来存储用户信息。每个请求也会发送一个会话 cookie,以便可以为每个请求恢复会话状态。
默认情况下,此会话状态对于您的 servlet 容器会在您停止服务器时保存到光盘,当您重新启动且会话仍然有效(未超时)时,它仍将具有身份验证。
您可以通过使 Spring 安全不使用会话(将会话模式设置为无状态)来解决此问题。
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
这样做的缺点是它会重新验证每个请求(这需要一些时间,因此会稍微影响您的性能)。但是现在重启后应该会报错,因为你修改了密码。
专家,
我有一个 spring 引导 2.5.5 应用程序(嵌入式 tomcat),我必须在其中配置基本身份验证。
这是我拥有的 class 可以为我工作的
@Component
@EnableWebSecurity
public class ApplicationSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.httpBasic();
}
}
问题是我只需要在浏览器中输入一次 user/password 就可以处理任何后续请求。此外,我不需要在服务器重新启动后提供新的 username/password 这让我发疯 - 该应用程序仍然有效,我可以访问我的 APIs/pages.
即使我假设浏览器以某种方式保存用户名和密码,一旦服务器重新启动后密码被更改,它也不应该工作 - 不是吗?
更新二:
遵循 M 的建议。 Deinum 我使会话无状态并且有效。然后我继续使用 InMemoryUserDetailsManager 实现 Basic Auth 并添加了下面的代码,我们又回到了同样的问题。凭据似乎再次存储在会话中,我不需要为后续请求传递它们。
@Autowired
public ApplicationSecurityConfig(PasswordEncoder passwordEncoder) {
this.passwordEncoder = passwordEncoder;
}
@Override
@Bean
protected UserDetailsService userDetailsService() {
UserDetails user = User
.builder()
.username("admin")
.password(passwordEncoder.encode("admin"))
.roles("ADMINISTRATOR")
.build();
return new InMemoryUserDetailsManager(user);
}
这就是我希望它与您当前的配置一起工作的方式。
当通过基本身份验证成功验证时,浏览器将为所有其他后续请求发送 username/password。所以这符合预期。
另一件事是,默认情况下,Spring Security 将使用HTTP Session 来存储用户信息。每个请求也会发送一个会话 cookie,以便可以为每个请求恢复会话状态。
默认情况下,此会话状态对于您的 servlet 容器会在您停止服务器时保存到光盘,当您重新启动且会话仍然有效(未超时)时,它仍将具有身份验证。
您可以通过使 Spring 安全不使用会话(将会话模式设置为无状态)来解决此问题。
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
这样做的缺点是它会重新验证每个请求(这需要一些时间,因此会稍微影响您的性能)。但是现在重启后应该会报错,因为你修改了密码。