[解決済み] Spring Securityによるユニットテスト
質問
私の会社では、次のプロジェクトでSpring MVCを使うべきかどうかを判断するために、評価を行っています。今のところ、私は見たものが大好きで、今、Spring Securityモジュールを見て、それが使えるかどうか、使うべきかどうかを判断しているところです。
私たちのセキュリティ要件はかなり基本的なもので、ユーザーはサイトの特定の部分にアクセスするためにユーザー名とパスワードを提供する必要があるだけです(自分のアカウントに関する情報を得るなど)。
私が作成したプロトタイプでは、認証されたユーザーのために、(ユーザー名とパスワードだけを含む)"LoginCredentials" オブジェクトをセッションに保存しています。いくつかのコントローラは、このオブジェクトがセッションにあるかどうかをチェックして、例えば、ログインしたユーザー名の参照を取得することができます。私はこの自前のロジックをSpring Securityに置き換えたいと考えています。そうすれば、コントローラやビジネスコードから「どうやってログインユーザーを追跡するのか?
Spring Securityは(スレッドごとに)"context"オブジェクトを提供し、アプリ内のどこからでもユーザー名/プリンシパル情報にアクセスできるようです...。
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
...このオブジェクトはある意味、(グローバルな)シングルトンなので、とてもSpringらしくないように思えますが。
もしこれがSpring Securityで認証されたユーザーに関する情報にアクセスする標準的な方法なら、ユニットテストが認証されたユーザーを必要とするときに、私のユニットテストで利用できるように、SecurityContextにAuthenticationオブジェクトを注入する受け入れられた方法は何でしょうか。
各テストケースの初期化メソッドで配線する必要があるのでしょうか?
protected void setUp() throws Exception {
...
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(testUser.getLogin(), testUser.getPassword()));
...
}
これは冗長すぎるように思います。もっと簡単な方法はないのでしょうか?
は
SecurityContextHolder
オブジェクト自体が春らしくないような気もしますが...。
解決方法は?
問題は、Spring SecurityがAuthenticationオブジェクトをコンテナ内のBeanとして利用できないため、簡単にインジェクションやオートワイアを行う方法がないことです。
Spring Securityを使い始める前は、Principalを格納するためにコンテナ内でセッションスコープのBeanを作成し、これを"AuthenticationService"(シングルトン)にインジェクトし、このBeanを現在のPrincipalに関する知識を必要とする他のサービスにインジェクトする、という方法を取っていました。
もしあなたが独自の認証サービスを実装しているなら、基本的に同じことができます。quot;principal"プロパティを持つセッションスコープのビーンを作成し、これをあなたの認証サービスに注入します。
SecurityContextHolder.を使うのは悪くないと思うんだけどね。 Springは静的なSingletonを推奨していますが、Servletコンテナではセッション、JUnitテストではスレッドなど、環境に応じて適切に動作するような実装になっています。 シングルトンの本当の限界は、異なる環境に対して柔軟性のない実装を提供してしまうことです。
関連
-
undefinedeclipse エラー。この行に複数のアノテーションが見つかりました: - 文字列を型解決に解決できない
-
javaで非静的な解を静的な参照にすることができない
-
プロジェクトの依存関係を解決できなかった 解決
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
eclipseにプロジェクトをインポートした後、Editorにmain typeが含まれない問題
-
アイデア Springboot Web プロジェクトを jar にパッケージ化する場合、Error: 無効または破損した jarfile x.jar 解決策
-
Eclipse起動エラー:javaは起動したが、終了コード=1を返した(ネット上の様々な落とし穴)
-
IDEA パッケージステートメントの欠落
-
[解決済み] Spring Securityを使用する場合、Beanで現在のユーザー名(つまりSecurityContext)情報を取得する適切な方法は何ですか?
-
[解決済み] Spring Test & Security: 認証をモック化する方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
java.util.NoSuchElementException 原因解析と解決方法
-
スタイルシートとして解釈されるリソースが、MIMEタイプtext/htmlで転送される。
-
javaで非静的な解を静的な参照にすることができない
-
Android Studio 3.1.2 で v4, v7 パッケージが見つからない シンボル 'AppCompatActivity' を解決できない
-
エラーの解決方法 jarfile XXX.jarにアクセスできません。
-
Methodのinvokeメソッド実装のJavaリフレクション
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
linux run jarfile Invalid or corrupt jarfile error.
-
起動時にEclipseエラーが発生しました。起動中に内部エラーが発生しました。java.lang.NullPoin: "Javaツーリングの初期化 "中に内部エラーが発生しました。
-
[解決済み] Spring Securityを使用する場合、Beanで現在のユーザー名(つまりSecurityContext)情報を取得する適切な方法は何ですか?