私はSpringBootアプリケーションで作業しています。 SpringBooTestとTestNGを使用してREST APIの統合テストを実行しています。ステートレスアプリケーションです。セッションは保存されません。TestNGでSpringBootTestを使用するとSecurityContextがクリアされない
コンテキスト
私は明示的にこの時点の後
Authentication authentication = new UsernamePasswordAuthenticationToken(contextUser, "", null);
SecurityContextHolder.getContext().setAuthentication(authentication);
// Continue to app.
以下のようにSecurityContextがに認証オブジェクトを設定し、フィルターを持っているトークンがすでに検証されるように、私は、任意の認証マネージャを使用していません。私は明示的にどこでもセキュリティコンテキストをクリアしていません。
問題
私はSpringBootTestからテストのカップルを実行すると、第二の試験はまだ最初のテストに設定されたセキュリティコンテキストへのアクセス権を持っています。デバッグモードでテストを実行したとき、私はSecurityContextPersistenceFilter
からSecurityContextHolder.clearContext();
が呼び出され、コンテキストをクリアする必要があることがわかります。
この問題を解決するにはどうすればよいですか?私はセキュリティのコンテキストは、要求が完了した後に常にクリアされるべきだと思って、次のテストのために利用できないはずです。
すべてのリクエストはセキュリティチェーンを通過しますか?それらのうちのいくつかがセキュリティで保護されたチェーンを通過せずにフィルタが引き続き呼び出された場合、基本的には漏れがあります。 –
'/ authenticate'に対してpermitAll()を設定しました。 '/ authenticate'のリソースクラスは認証マネージャを呼び出し、セキュリティコンテキストを設定します。 permitAllのセキュリティチェーンを通過しないように見えますか?この '/ authenticate'リクエストは、' http.addFilterBefore(customFilter、UsernamePasswordAuthenticationFilter.class); 'として設定されているため、OPで言及されているフィルタも通過しません。 – TechCrunch