Spring Security で独自の認証処理を利用する
新規プロジェクトのため Spring Security を勉強しています。 そこで、既存のアプリケーションを移植してみることにしたのですが、ユーザーを認証する処理で躓いてしまいました。 移植を試みたアプリケーションでは、認証に利用するパスワードのハッシュ化に、データベースの関数を利用しています。 PasswordEncoder を実装することも考えましたが、勉強のため別の方法をとってみることにしました。
** 認証処理を実装する
UserDetailsService を実装して利用する場合、 loadUserByUsername の引数がメールアドレスのみです。 このため、データベースへメールアドレスとパスワードを利用した問い合わせすることができません。 そのため、 UserDetailsService を利用するのではなく、今回は AuthenticationProvider を実装してみることにしました。
@Service public class CustomAuthenticationProvider implements AuthenticationProvider { @Autowired public UserDetailsService userDetailsService; @Autowired public UserDao userDao; @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { user user = userDao.findByMailAddressAndPassword(authentication.getName(), (String)authentication.getCredentials()); if (user == null) { throw new UsernameNotFoundException("User not found by email:[" + authentication.getName() + "]"); } LoginUser loginUser = new LoginUser(user); return new UsernamePasswordAuthenticationToken(loginUser, loginUser.getPassword(), loginUser.getAuthorities()); } @Override public boolean supports(Class<?> authentication) { return authentication.equals(UsernamePasswordAuthenticationToken.class); } }
このクラスを利用するため、 WebSecurityConfigurerAdapter の実装クラスを以下のように変更します。
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // auth // .userDetailsService(userDetailsService) // .passwordEncoder(passwordEncoder()); auth.authenticationProvider(customAuthenticationProvider); }
以上の変更で、独自に認証処理を利用することができるようになりました。