概要
Spring Bootで認証を実装しようとする際に、Spring Securityを使うこともあると思います。
Spring Securityではログイン時に項目を設定すれば自動で認証する仕組みがあるのですが、基本的にはユーザ名とパスワードのセットで認証を行います。それ以外に認証用の項目を追加したい場合はどうすればいいのか、書いてみます。
前提など
- 実装する際のベースとなる設定等はSpring Security with Spring Boot 2.0で簡単なRest APIを実装するの内容を前提とします。SpringSecurityの設定全般について、分かりやすく解説されている記事です。
- 上記の記事ではユーザの取得に
UserDetailsService
を使用しているので、これを活かして追加で実装する形にします。今回はDaoAuthenticationProvider
を使用する方法で実装します。Check extra parameters with Spring Securityの記事を参考にしています。
実装サンプル
SecurityConfigに、authenticationProviderを追加します。authenticationProviderは後述の独自に実装したAuthenticationProviderImpl
を設定します。
また、configureGlobalにてauthenticationProviderを設定します。
SecurityConfig.java
@Autowired
private AuthenticationProviderImpl authenticationProvider;
@Autowired
public void configureGlobal(
AuthenticationManagerBuilder auth,
@Qualifier("userService") UserDetailsService userDetailsService,
PasswordEncoder passwordEncoder) throws Exception {
authenticationProvider.setUserDetailsService(userDetailsService);
authenticationProvider.setPasswordEncoder(passwordEncoder);
auth.eraseCredentials(true)
.authenticationProvider(authenticationProvider);
}
独自で実装するauthenticationProvider。テーブルにstatus列を追加して、active
ではないユーザは認証NGとしています。
AuthenticationProviderImpl.java
@Component
public class AuthenticationProviderImpl extends DaoAuthenticationProvider {
@Override
protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException {
super.additionalAuthenticationChecks(userDetails, authentication);
User user = (User) userDetails;
// 追加の条件
if (!user.getStatus().equals("active")) {
throw new AccountStatusNotActiveException("Status is not active");
}
}
public static class AccountStatusNotActiveException extends AuthenticationException {
public AccountStatusNotActiveException(String message) {
super(message);
}
}
@Override
protected void doAfterPropertiesSet() {}
}