最新の安定バージョンについては、Spring Security 6.3.1 を使用してください!

インメモリ認証

Spring Security の InMemoryUserDetailsManager は UserDetailsService を実装して、メモリに格納されるユーザー名 / パスワードベースの認証をサポートします。InMemoryUserDetailsManager は、UserDetailsManager インターフェースを実装することにより、UserDetails の管理を提供します。UserDetails ベースの認証は、Spring Security が認証用のユーザー名 / パスワードを受け入れるように構成されている場合に使用されます。

このサンプルでは、Spring Boot CLI を使用して password のパスワードをエンコードし、エンコードされた {bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW のパスワードを取得します。

InMemoryUserDetailsManager Java 構成
  • Java

  • XML

  • Kotlin

@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);
}
<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>
@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 は「使用を開始する」ためにのみ使用する必要があり、本番環境での使用を目的としていません。

User.withDefaultPasswordEncoder を使用した InMemoryUserDetailsManager
  • Java

  • Kotlin

@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);
}
@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} を付けて、エンコードを使用しないことを示すことができます。

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