EatSmartシステム部ブログ

ウェブサイトの開発や運営に関する情報です。

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);
    }

以上の変更で、独自に認証処理を利用することができるようになりました。