如何在用户密码更改时重新配置 SpringBoot 的内存中身份验证?

时间:2021-06-30 12:14:18

标签: java spring spring-boot spring-security jersey-2.0

我使用 SpringBoot v2.4.2 来托管一些基于 JAX-RS (Jersey) 的 REST API。并且这些 API 使用 Spring 的内存中身份验证器进行保护(BASIC auth),即通过扩展 WebSecurityConfigurerAdapter

以下是代码片段:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
    auth.inMemoryAuthentication()
        .withUser(username)
        .password(encoder.encode(passwd));
}

现在的问题是,如果用户(在本例中为管理员)更新了他/她的密码,我该如何更新此内存中的身份验证机制。我确实允许用户在使用默认用户名/密码(只有管理员知道)登录后更新密码。

如何将代码流/事件返回到 configure(AuthenticationManagerBuilder auth) 方法以使用新密码?

谢谢。

2 个答案:

答案 0 :(得分:0)

我建议设置您通常使用的密码,然后刷新主体。意思是:更新密码,注销用户,然后重新登录。考虑在更改密码后强制用户再次登录可能是公平的 - 如果内置 auth&auth,这是一种常见做法。

答案 1 :(得分:0)

InMemoryUserDetailsManager 实现了两个接口:UserDetailsManagerUserDetailsPasswordService

这两个接口分别有两个方法:changePasswordupdatePassword。您可以注入其中任何一个并使用其实现来更改用户的密码。

@Autowired
private UserDetailsManager userDetailsManager;

public void changePassword(String oldPassword, String newPassword) {
    this.userDetailsManager.changePassword(oldPassword, newPassword);
}

InMemoryUserDetailsManager implementation 中有更多详细信息。