# 内存中身份验证

Spring Security 的`InMemoryUserDetailsManager`实现[UserDetailsService](user-details-service.html#servlet-authentication-userdetailsservice)以提供对存储在内存中的基于用户名/密码的身份验证的支持。`InMemoryUserDetailsManager`通过实现`UserDetailsManager`接口提供`UserDetails`的管理。 Spring Security 在将其配置为[接受用户名/密码](index.html#servlet-authentication-unpwd-input)以进行身份验证时使用基于`UserDetails`的身份验证。

在这个示例中，我们使用[Spring Boot CLI](../../../features/authentication/password-storage.html#authentication-password-storage-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](../../../features/authentication/password-storage.html#authentication-password-storage-dep-getting-started)来确保存储在内存中的密码受到保护。然而，它并不能防止通过解码源代码获取密码。因此，`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}`来表示[不应使用编码](../../../features/authentication/password-storage.html#authentication-password-storage-dpe-format)。

例 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>
```

[密码存储](storage.html)[JDBC](jdbc.html)

