Spring Securityの認証機能を利用する処理を実装する
先日記事を書いたSpring Bootのプロジェクトの続きです。
ユーザーによるフォームを利用した認証は、Spring Securityが提供しているものを利用します。 これとは別に、他の処理と組み合わせて認証する機能が必要になりました。 ドキュメントを確認すると、AuthenticationManager#authenticate を実行することで認証機能を実現できることがわかりました。
以下のように、ユーザー処理をまとめたサービスクラスへ、認証に利用するメソッドを追加しました。
@Service public class SmeUserDetailsService implements UserDetailsService { @Autowired public AuthenticationManager authenticationManager; public void auth(String email, String password) { UserDetails userDetail = loadUserByUsername(email); UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(userDetail, password); Authentication auth = authenticationManager.authenticate(authReq); SecurityContextHolder.getContext().setAuthentication(auth); } }
認証を行いたい処理は、authメソッドを利用して認証処理を行なうことができます。 また、最後の処理でセキュリティコンテキストの内容を更新することで、Controller/Viewから参照される認証済みのユーザー情報が更新されます。
これとは別に、認証済みのユーザー情報に含まれる内容を反映する処理も以下のように実装してみました。 例えば、プロフィールページで名前を更新しても、Viewで表示される名前は更新前のものです。 そこで、更新後にセキュリティコンテキストの内容を更新することで、更新後のものが表示されるようになります。
public void refreshAuthentication(LoginUser loginUser) { UserDetails userDetail = loadUserByUsername(loginUser.getUser().getMailAddress()); Authentication authentication = new UsernamePasswordAuthenticationToken(userDetail, userDetail.getPassword(), userDetail.getAuthorities()); SecurityContextHolder.getContext().setAuthentication(authentication); }
以上で、Spring Securityの認証機能を利用する処理を実装することができました。 Spring Securityを利用して認証関連の処理を任せることで、提供するサービスの処理を開発することに集中することができました。