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