Spring Securityでユーザーを手動で認証する方法

1概要

このクイック記事では、Spring SecurityとSpring MVCで認証されたユーザをプログラムで設定する方法に焦点を当てます。

2春のセキュリティ

簡単に言うと、Spring Securityは、認証された各ユーザのプリンシパル情報を、 Authentication オブジェクトとして表される ThreadLocal に保持します。

この Authentication オブジェクトを構築および設定するには、Spring Securityが標準の認証に基づいてオブジェクトを構築するために通常使用するのと同じアプローチを使用する必要があります。

これを行うには、手動で認証をトリガーしてから、結果の Authentication オブジェクトを、現在ログインしているユーザーを保持するためにフレームワークで使用されている現在の SecurityContext に設定します。

UsernamePasswordAuthenticationToken authReq
 = new UsernamePasswordAuthenticationToken(user, pass);
Authentication auth = authManager.authenticate(authReq);
SecurityContext sc = SecurityContextHolder.getContext();
securityContext.setAuthentication(auth);

Authentication をコンテキストに設定した後は、 securityContext.getAuthentication()。isAuthenticated() を使用して現在のユーザーが認証されているかどうかを確認できます。

3春MVC

デフォルトでは、Spring SecurityはSpring Securityフィルタチェーンに追加のフィルタを追加する - これはセキュリティコンテキスト( SecurityContextPersistenceFilter クラス)を永続化することができる。

次に、セキュリティコンテキストの永続性を SecurityContextRepository のインスタンスに委任します。デフォルトでは HttpSessionSecurityContextRepository クラスになります。

そのため、リクエストに認証を設定し、クライアントからの以降のすべてのリクエストで認証を使用できるようにするには、HTTPセッションで Authentication を含む SecurityContext を手動で設定する必要があります。

public void login(HttpServletRequest req, String user, String pass) {
    UsernamePasswordAuthenticationToken authReq
      = new UsernamePasswordAuthenticationToken(user, pass);
    Authentication auth = authManager.authenticate(authReq);

    SecurityContext sc = SecurityContextHolder.getContext();
    sc.setAuthentication(auth);
    HttpSession session = req.getSession(true);
    session.setAttribute(SPRING__SECURITY__CONTEXT__KEY, sc);
}

SPRING SECURITY CONTEXT KEY は、静的にインポートされた HttpSessionSecurityContextRepository.SPRING SECURITY CONTEXT KEY です。

HttpSessionSecurityContextRepository は__SecurityContextPersistenceFilterと連携して機能するため、直接使用することはできません。

これは、フィルタがチェーン内の残りの定義済みフィルタの実行前後にセキュリティコンテキストをロードおよび格納するためにリポジトリを使用するためですが、チェーンに渡される応答に対してカスタムラッパーを使用するためです。

したがって、この場合は、使用されているラッパーのクラス・タイプを知っていて、それをリポジトリー内の適切なsaveメソッドに渡す必要があります。

4結論

このクイックチュートリアルでは、Spring Securityのコンテキストでユーザー Authentication を手動で設定する方法と、それを実現するための最も簡単な方法を示すコードサンプルを中心に、Spring MVCの目的でユーザーを利用可能にする方法について説明しました。

いつものように、コードサンプルはhttps://github.com/eugenp/tutorials/tree/master/spring-security-mvc-custom[over on GitHub]にあります。