# 内存中身份验证
Spring Security 的InMemoryUserDetailsManager
实现UserDetailsService以提供对存储在内存中的基于用户名/密码的身份验证的支持。InMemoryUserDetailsManager
通过实现UserDetailsManager
接口提供UserDetails
的管理。 Spring Security 在将其配置为接受用户名/密码以进行身份验证时使用基于UserDetails
的身份验证。
在这个示例中,我们使用Spring Boot CLI对password
的密码进行编码,并获得{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW
的编码密码。
例 1。InMemoryUserDetailsManager 爪哇 配置
爪哇
@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);
}
XML
<user-service>
<user name="user"
password="{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW"
authorities="ROLE_USER" />
<user name="admin"
password="{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW"
authorities="ROLE_USER,ROLE_ADMIN" />
</user-service>
Kotlin
@Bean
fun users(): UserDetailsService {
val user = User.builder()
.username("user")
.password("{bcrypt}$2a$10\$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW")
.roles("USER")
.build()
val admin = User.builder()
.username("admin")
.password("{bcrypt}$2a$10\$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW")
.roles("USER", "ADMIN")
.build()
return InMemoryUserDetailsManager(user, admin)
}
上面的示例以安全的格式存储密码,但在入门体验方面还有很多不足之处。
在下面的示例中,我们利用User.withDefaultPasswordEncoder来确保存储在内存中的密码受到保护。然而,它并不能防止通过解码源代码获取密码。因此,User.withDefaultPasswordEncoder
只应用于“开始”,而不是用于生产。
例 2。在 MemoryUserDetailsManager 中使用 user.withDefaultPassWordEncoder
Java
@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);
}
Kotlin
@Bean
fun users(): UserDetailsService {
// The builder will ensure the passwords are encoded before saving in memory
val users = User.withDefaultPasswordEncoder()
val user = users
.username("user")
.password("password")
.roles("USER")
.build()
val admin = users
.username("admin")
.password("password")
.roles("USER", "ADMIN")
.build()
return InMemoryUserDetailsManager(user, admin)
}
对于基于 XML 的配置,没有简单的方法来使用User.withDefaultPasswordEncoder
。对于演示或刚刚开始,你可以选择在密码前加上{noop}
来表示不应使用编码。
例 3。<user-service>{noop}
XML 配置
<user-service>
<user name="user"
password="{noop}password"
authorities="ROLE_USER" />
<user name="admin"
password="{noop}password"
authorities="ROLE_USER,ROLE_ADMIN" />
</user-service>