Spring Securityでユーザーを手動で認証する方法
1. 概要
この簡単な記事では、SpringSecurityとSpringMVCで認証されたユーザーをプログラムで設定する方法に焦点を当てます。
2. 春のセキュリティ
簡単に言えば、Spring Securityは、認証された各ユーザーの主要な情報をThreadLocalに保持します–Authenticationオブジェクトとして表されます。
このAuthenticationオブジェクトを構築および設定するには、SpringSecurityが標準認証でオブジェクトを構築するために通常使用するのと同じアプローチを使用する必要があります。
するには、手動で認証をトリガーし、結果の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クラスにします。
したがって、リクエスト、つまりmake it available for all subsequent requests from the clientに認証を設定するには、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です。
SecurityContextPersistenceFilter.と連動して機能するため、HttpSessionSecurityContextRepositoryを直接使用できないことに注意してください。
これは、フィルターがチェーン内の定義済みフィルターの残りの実行の前後にセキュリティコンテキストをロードおよび保存するためにリポジトリを使用しますが、チェーンに渡される応答に対してカスタムラッパーを使用するためです。
そのため、この場合、使用するラッパーのクラスタイプを知って、リポジトリ内の適切なsaveメソッドに渡す必要があります。
4. 結論
このクイックチュートリアルでは、Spring SecurityコンテキストでユーザーAuthenticationを手動で設定する方法と、Spring MVCの目的でユーザーを利用できるようにする方法について説明し、それを実現する最も簡単な方法を示すコードサンプルに焦点を当てました。
いつものように、コードサンプルはover on GitHubで見つけることができます。