SpringSecurityを使用してユーザーを手動で認証する方法
1. 概要
このクイック記事では、Springセキュリティと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();
sc.setAuthentication(auth);
コンテキストでAuthenticationを設定した後、 securityContext.getAuthentication()。isAuthenticated()を使用して、現在のユーザーが認証されているかどうかを確認できるようになります。
3. SpringMVC
デフォルトでは、SpringSecurityはSpringSecurityフィルターチェーンに追加のフィルターを追加します。これは、セキュリティコンテキスト( SecurityContextPersistenceFilter クラス)を永続化することができます。
次に、セキュリティコンテキストの永続性を SecurityContextRepository のインスタンスに委任し、デフォルトでHttpSessionSecurityContextRepositoryクラスになります。
したがって、リクエストに認証を設定し、をクライアントからの後続のすべてのリクエストで利用できるようにするには、Authenticationを含むSecurityContextを手動で設定する必要があります。 HTTPセッション:
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. 結論
このクイックチュートリアルでは、SpringSecurityコンテキストでユーザーAuthentication を手動で設定する方法と、SpringMVCの目的でユーザーを利用できるようにする方法について説明しました。それ。
いつものように、コードサンプルはGitHubのにあります。