2017-05-18 3 views
0

私は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();が呼び出され、コンテキストをクリアする必要があることがわかります。

この問題を解決するにはどうすればよいですか?私はセキュリティのコンテキストは、要求が完了した後に常にクリアされるべきだと思って、次のテストのために利用できないはずです。

+1

すべてのリクエストはセキュリティチェーンを通過しますか?それらのうちのいくつかがセキュリティで保護されたチェーンを通過せずにフィルタが引き続き呼び出された場合、基本的には漏れがあります。 –

+0

'/ authenticate'に対してpermitAll()を設定しました。 '/ authenticate'のリソースクラスは認証マネージャを呼び出し、セキュリティコンテキストを設定します。 permitAllのセキュリティチェーンを通過しないように見えますか?この '/ authenticate'リクエストは、' http.addFilterBefore(customFilter、UsernamePasswordAuthenticationFilter.class); 'として設定されているため、OPで言及されているフィルタも通過しません。 – TechCrunch

答えて

1

フィルタをSpring統合テストで実行するために、コンテキストをクリアするために、以下のようにFilterChainProxyを設定する必要がありました。

restLoginMockMvc = MockMvcBuilders.standaloneSetup(loginResource).setControllerAdvice(exceptionTranslator) 
      .apply(springSecurity(springSecurityFilterChain)).build(); 
関連する問題