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

8 浏览
0 Comments

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

我正在使用SpringBoot v2.4.2来托管一些基于JAX-RS (Jersey)的REST API。这些API使用Spring的内存身份验证器(继承WebSecurityConfigurerAdapter)进行安全验证(BASIC auth)。

以下是代码片段:

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

现在的问题是,如果用户(在这种情况下是管理员)更新了密码,我该如何更新这个内存身份验证机制。我允许用户在使用默认的用户名/密码登录后更新密码(只有管理员知道默认的用户名/密码)。

我该如何将代码流/事件传回configure(AuthenticationManagerBuilder auth)方法以使用新的密码?

谢谢。

0
0 Comments

问题出现的原因是:用户密码更改后,SpringBoot的内存身份验证没有重新配置,导致无法使用新密码进行验证。

解决方法是:在通常获取密码的位置更新密码,并刷新 principal(身份验证主体)。即:更新密码,注销用户,然后再次登录。如果身份验证和授权是内置的,通常会考虑在更改密码后强制用户重新登录,这是常见做法。

对于我来说,我正在使用Spring安全的最简形式,并且没有直接处理 principal/session。同时,密码不是通过重置表单更新的,而是作为配置设置的一部分。所以对我来说注销用户不是一个选项。不知道Spring中是否有其他解决方法。

0
0 Comments

问题的出现原因是用户想要在更改密码时重新配置Spring Boot的内存身份验证。用户希望能够使用自定义的方法来更改用户密码,而不是使用默认的方法。

解决方法是使用InMemoryUserDetailsManager类实现用户密码的更改。该类实现了UserDetailsManagerUserDetailsPasswordService接口,并提供了changePasswordupdatePassword方法来更改用户密码。用户可以注入任何一个接口的实现,并使用其提供的方法来更改用户密码。

以下是一个示例代码,展示了如何使用InMemoryUserDetailsManager类来更改用户密码:

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

用户可以根据自己的需求使用该方法来更改用户密码。

更多关于InMemoryUserDetailsManager类的详细信息可以在GitHub上找到。

感谢用户提供的相关信息和帮助。用户也可以在Stack Overflow上找到类似的问题和答案。

0