spring - Spring Security 基本身份验证密码轮换问题
问题描述
专家,,
我有一个 spring boot 2.5.5 应用程序(嵌入式 tomcat),我必须在其中配置基本身份验证。
这是我为我工作的课程
@Component
@EnableWebSecurity
public class ApplicationSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.httpBasic();
}
}
问题是我只需要在浏览器中输入一次用户/密码,它就适用于任何后续请求。此外,我不需要在服务器重新启动后提供新的用户名/密码,这让我抓狂——该应用程序仍然有效,我可以访问我的 API/页面。
即使我假设浏览器以某种方式保存了用户名和密码,一旦服务器重新启动,因为密码被更改,它也不应该工作 - 不是吗?
更新二:
根据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);
}
解决方案
这就是我希望它与您当前的配置一起工作的方式。
使用基本身份验证成功通过身份验证后,浏览器将为所有其他后续请求发送用户名/密码。所以这是意料之中的。
另一件事是,默认情况下,Spring Security 将使用 HTTP Session 来存储用户信息。每个请求还会发送一个会话 cookie,以便可以为每个请求恢复会话状态。
默认情况下,对于您的 servlet 容器,此会话状态在您停止服务器时保存到磁盘,当您重新启动并且会话仍然有效(未超时)时,它仍然具有身份验证。
您可以通过使 Spring Security 不使用会话(将会话模式设置为无状态)来解决此问题。
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
这样做的缺点是它会重新验证每个请求(这需要一些时间,因此会稍微影响您的性能)。但是现在重新启动后应该会出错,因为您更改了密码。
推荐阅读
- r - 使用 apply 将每个函数调用的多个输出放置到 R 中数据帧的一行中
- php - 内部站点搜索仅匹配确切的单词
- javascript - 鼠标在jquery中移动时添加不同的图像
- woocommerce - Woocommerce - 根据人数计算额外费用
- c++ - 为什么我的代码会导致高返回值?C++
- android - 导航图 - 如何使用导航图和导航抽屉中的自定义片段来管理导航抽屉
- mysql - 带有 WHERE 子句的 MySQL SELECT 查询不从两个表中返回行
- javascript - 搜索表单多个字段 javascript
- angular - 超时 - 在 jest.setTimout.Timeout 指定的 10000 毫秒超时内不涉及异步回调
- r - ggplot:堆叠条形图 - geom_text 标签凌乱