【Java】Spring Bootでログイン処理を個別に組み込みたい場合

1 min読了の目安(約1600字TECH技術記事

概要

Spring BootではSpring Securityの機能を使用する事で、ログインの処理を組み込むことができます。詳細についてはSpring Security with Spring Boot 2.0で簡単なRest APIを実装するに詳しく解説されています。
この記事中にもありますが、loginのAPIはデフォルトで提供されるので、別途実装することは不要です。ただ、ログイン処理を別途何かの処理のついでに組み込みたい場合もあるかと思います。今回はログイン処理を個別に組み込む場合の方法について書きます。

対応方法

Spring Securityでユーザーを手動で認証する方法に書いてあるとおり、手動で認証を実装することができます。認証した内容をSecurityContextに設定することでログイン状態にできます。

実装サンプル

ほぼ、上記記事のコピペですが、実装サンプルものせておきます。上記記事と違う点は、AuthenticationProviderを使用している箇所になります。

SampleUserService.java

@Service
public class SampleUserService implements UserDetailsService {

  @Autowired
  UserRepository userRepository;
  @Autowired
  AuthenticationProvider authenticationProvider;

  @Override
  public UserDetails loadUserByUsername(final String email) {
    // emailでデータベースからユーザーエンティティを検索する
    UserDetails user = userRepository.findByEmail(email);
    if (user == null) {
      throw new UsernameNotFoundException("user not found");
    }
    return user;
  }

  // ユーザの手動認証
  public void authEmail(String email, String password) {
    // 認証
    UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(email, password);
    try {
      Authentication auth = authenticationProvider.authenticate(authenticationToken);
      SecurityContextHolder.getContext().setAuthentication(auth);
    }
    catch (Exception exception) {
      throw new AppException(HttpStatus.UNAUTHORIZED, "UnAuthorized");
    }
  }
  
}