跳到主要内容

内存认证

QWen Max 中英对照 In Memory In-Memory Authentication

Spring Security 的 InMemoryUserDetailsManager 实现了 UserDetailsService,以提供基于内存存储的用户名/密码身份验证支持。InMemoryUserDetailsManager 通过实现 UserDetailsManager 接口来管理 UserDetails。当 Spring Security 被配置为接受用户名和密码进行身份验证时,会使用基于 UserDetails 的身份验证。

在以下示例中,我们使用 Spring Boot CLIpassword 值进行编码,并得到编码后的密码 {bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW

@Bean
public UserDetailsService users() {
UserDetails user = User.builder()
.username("user")
.password("{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW")
.roles("USER")
.build();
UserDetails admin = User.builder()
.username("admin")
.password("{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW")
.roles("USER", "ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
java

前面的示例以安全的格式存储密码,但在入门体验方面还有很多不足。

在下面的示例中,我们使用 User.withDefaultPasswordEncoder 来确保存储在内存中的密码是受保护的。然而,它并不能防止通过反编译源代码来获取密码。因此,User.withDefaultPasswordEncoder 仅应用于“入门”,并不适用于生产环境。

@Bean
public UserDetailsService users() {
// The builder will ensure the passwords are encoded before saving in memory
UserBuilder users = User.withDefaultPasswordEncoder();
UserDetails user = users
.username("user")
.password("password")
.roles("USER")
.build();
UserDetails admin = users
.username("admin")
.password("password")
.roles("USER", "ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
java

没有简单的方法可以使用基于XML的配置来使用 User.withDefaultPasswordEncoder。对于演示或刚刚开始使用时,你可以选择在密码前加上 {noop} 前缀,以表示不应使用任何编码

<user-service>
<user name="user"
password="{noop}password"
authorities="ROLE_USER" />
<user name="admin"
password="{noop}password"
authorities="ROLE_USER,ROLE_ADMIN" />
</user-service>
xml