⚙️
【Java】Spring Bootでログイン処理を個別に組み込みたい場合
概要
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");
}
}
}
Discussion