JDBC 認証
Spring Security の JdbcDaoImpl
は UserDetailsService
を実装して、JDBC を使用して取得されるユーザー名とパスワードに基づく認証をサポートします。JdbcUserDetailsManager
は JdbcDaoImpl
を継承して、UserDetailsManager
インターフェースを介して UserDetails
の管理を提供します。UserDetails
ベースの認証は、Spring Security が認証のためにユーザー名 / パスワードを受け入れるように構成されている場合に使用されます。
次のセクションでは、以下について説明します。
Spring Security JDBC 認証で使用されるデフォルトスキーマ
デフォルトスキーマ
Spring Security は、JDBC ベースの認証用のデフォルトのクエリを提供します。このセクションでは、デフォルトのクエリで使用される対応するデフォルトのスキーマを提供します。使用するクエリとデータベースダイアレクトのカスタマイズに一致するようにスキーマを調整する必要があります。
ユーザースキーマ
JdbcDaoImpl
には、パスワード、アカウントステータス(有効または無効)、ユーザーの権限(ロール)のリストをロードするためのテーブルが必要です。
デフォルトのスキーマは、 |
create table users(
username varchar_ignorecase(50) not null primary key,
password varchar_ignorecase(500) not null,
enabled boolean not null
);
create table authorities (
username varchar_ignorecase(50) not null,
authority varchar_ignorecase(50) not null,
constraint fk_authorities_users foreign key(username) references users(username)
);
create unique index ix_auth_username on authorities (username,authority);
Oracle は一般的なデータベースの選択肢ですが、わずかに異なるスキーマが必要です。
CREATE TABLE USERS (
USERNAME NVARCHAR2(128) PRIMARY KEY,
PASSWORD NVARCHAR2(128) NOT NULL,
ENABLED CHAR(1) CHECK (ENABLED IN ('Y','N') ) NOT NULL
);
CREATE TABLE AUTHORITIES (
USERNAME NVARCHAR2(128) NOT NULL,
AUTHORITY NVARCHAR2(128) NOT NULL
);
ALTER TABLE AUTHORITIES ADD CONSTRAINT AUTHORITIES_UNIQUE UNIQUE (USERNAME, AUTHORITY);
ALTER TABLE AUTHORITIES ADD CONSTRAINT AUTHORITIES_FK1 FOREIGN KEY (USERNAME) REFERENCES USERS (USERNAME) ENABLE;
スキーマのグループ化
アプリケーションでグループを使用する場合は、グループスキーマを提供する必要があります。
create table groups (
id bigint generated by default as identity(start with 0) primary key,
group_name varchar_ignorecase(50) not null
);
create table group_authorities (
group_id bigint not null,
authority varchar(50) not null,
constraint fk_group_authorities_group foreign key(group_id) references groups(id)
);
create table group_members (
id bigint generated by default as identity(start with 0) primary key,
username varchar(50) not null,
group_id bigint not null,
constraint fk_group_members_group foreign key(group_id) references groups(id)
);
DataSource のセットアップ
JdbcUserDetailsManager
を構成する前に、DataSource
を作成する必要があります。この例では、デフォルトのユーザースキーマで初期化される埋め込み DataSource を設定します。
Java
XML
Kotlin
@Bean
DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(H2)
.addScript(JdbcDaoImpl.DEFAULT_USER_SCHEMA_DDL_LOCATION)
.build();
}
<jdbc:embedded-database>
<jdbc:script location="classpath:org/springframework/security/core/userdetails/jdbc/users.ddl"/>
</jdbc:embedded-database>
@Bean
fun dataSource(): DataSource {
return EmbeddedDatabaseBuilder()
.setType(H2)
.addScript(JdbcDaoImpl.DEFAULT_USER_SCHEMA_DDL_LOCATION)
.build()
}
本番環境では、外部データベースへの接続を確実に設定する必要があります。
JdbcUserDetailsManager Bean
このサンプルでは、Spring Boot CLI を使用して password
のパスワード値をエンコードし、エンコードされた {bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk76klW
のパスワードを取得します。パスワードの保存方法の詳細については、PasswordEncoder のセクションを参照してください。
Java
XML
Kotlin
@Bean
UserDetailsManager users(DataSource dataSource) {
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();
JdbcUserDetailsManager users = new JdbcUserDetailsManager(dataSource);
users.createUser(user);
users.createUser(admin);
return users;
}
<jdbc-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" />
</jdbc-user-service>
@Bean
fun users(dataSource: DataSource): UserDetailsManager {
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();
val users = JdbcUserDetailsManager(dataSource)
users.createUser(user)
users.createUser(admin)
return users
}