私の会社では、Spring MVC を評価して、次のプロジェクトで使用する必要があるかどうかを判断しています。今のところ、Spring Security モジュールを調べて、使用できる/使用する必要があるかどうかを判断しています。
私たちのセキュリティ要件は非常に基本的なものです。ユーザーは、ユーザー名とパスワードを入力するだけで、サイトの特定の部分にアクセスできます (自分のアカウントに関する情報を取得するなど)。サイトには、匿名ユーザーにアクセスを許可する必要があるページ (FAQ、サポートなど) がいくつかあります。
私が作成しているプロトタイプでは、認証されたユーザーのセッションに "LoginCredentials" オブジェクト (ユーザー名とパスワードのみを含む) を格納しています。たとえば、一部のコントローラーは、このオブジェクトがセッション内にあるかどうかを確認して、ログインしているユーザー名への参照を取得します。代わりに、この自家製のロジックを Spring Security に置き換えようと考えています。これにより、「ログインしているユーザーをどのように追跡するか」というあらゆる種類のものを削除できるという利点があります。および「ユーザーをどのように認証しますか?」私のコントローラー/ビジネスコードから。
Spring Security は、アプリのどこからでもユーザー名/プリンシパル情報にアクセスできるように、(スレッドごとの)「コンテキスト」オブジェクトを提供しているようです...
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
...ある意味で、このオブジェクトは(グローバル)シングルトンであるため、非常に春らしくないようです。
私の質問は次のとおりです。これが Spring Security で認証されたユーザーに関する情報にアクセスする標準的な方法である場合、Authentication オブジェクトを SecurityContext に挿入して、単体テストで認証されたユーザー?
各テスト ケースの初期化メソッドでこれを接続する必要がありますか?
protected void setUp() throws Exception {
...
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(testUser.getLogin(), testUser.getPassword()));
...
}
これは冗長すぎるようです。もっと簡単な方法はありますか?
オブジェクト自体はSecurityContextHolder
非常に春らしくないようです...