【问题标题】:Spring Security Basic Auth Password Rotation IssueSpring Security 基本身份验证密码轮换问题
【发布时间】:2021-11-22 00:05:00
【问题描述】:

专家,

我有一个 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);
    }

【问题讨论】:

  • 一旦服务器被重估.. ?您无需登录即可访问该页面吗?详细说明您的问题。
  • 不要在中途更新您的问题以提出其他问题。你问了什么,它得到了回答。然后,您接受答案并继续前进。 Stack Overflow 不是一个论坛,而是一个问答网站。您在中途更改问题告诉我们您没有完全理解您正在寻找的答案。
  • 再次,正如我在答案中所说,这就是基本身份验证的工作方式。一旦通过身份验证,浏览器将为每个请求发送用户名/密码。这是内置的浏览器功能......所以除非你重写浏览器(或在浏览器中找到一些秘密标志),否则这就是基本身份验证的工作方式。
  • @M.Deinum 我在配置方法中添加了“http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)”,所以我希望调用应该是无状态的
  • 您是否真的阅读答案... 1. 成功身份验证后的 Http Basic 始终发送用户名/密码(这仍然会发生并且使其无状态不会防止这种情况发生,您必须重建浏览器) 2. Stateles 有助于不在会话中存储身份验证,这会阻止在重新启动后仍然进行身份验证。这是两件不同且不相关的事情。我强烈建议您阅读基本身份验证的工作原理。

标签: spring spring-boot spring-security basic-authentication


【解决方案1】:

这就是我希望它与您当前的配置一起工作的方式。

当通过基本身份验证成功通过身份验证后,浏览器将为所有其他后续请求发送用户名/密码。所以这符合预期。

另外一点是,默认情况下,Spring Security 会使用 HTTP Session 来存储用户信息。每个请求还会发送一个 session-cookie,以便可以为每个请求恢复会话状态。

默认情况下,您的 servlet 容器的此会话状态会在您停止服务器时保存到磁盘,当您重新启动并且会话仍然有效(未超时)时,它仍然具有身份验证。

您可以通过使 Spring Security 不使用会话来解决此问题(将会话模式设置为无状态)。

http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)

这样做的缺点是它会重新验证每个请求(这需要一些时间,因此会稍微影响您的性能)。但是现在重启后应该会报错,因为你更改了密码。

【讨论】:

    猜你喜欢
    • 2013-05-13
    • 2019-04-08
    • 2011-02-11
    • 2016-03-20
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 2013-01-11
    • 2015-07-22
    相关资源
    最近更新 更多