2

私はSpring MVCコントローラのユニットテストを設定しており、Spring MVCテストフレームワークを利用しようとしています。私のコントローラー内の各エンドポイントについて、指定された権限を持つユーザーだけがアクセスできるようにしたいと考えています。私の問題は、カスタムのUser実装を使用して、これを回避するmockMvcツールを使用するときにクラスキャスト例外を取得することです。私は何とか自分のカスタム・ユーザー・プリンシパルを指定するには、上記のステートメントを微調整したいSpringセキュリティユニットテスト - MockMvcはカスタムユーザでテストを実行します

mockMvc.perform(MockMvcRequestBuilders.get(path).with(user("user").authorities(authorities))) 
       .andExpect(status().isOk()) 
       .andExpect(authenticated().withUsername("user")); 

:各リクエストに対して

は、私はそれがこのような何かを見て期待しています。以下のSpringのuserメソッドを参照してください。私の最初の考えは、クラスUserRequestPostProcessorをオーバーライドし、標準のSpring Securityユーザーの代わりに私のカスタムユーザータイプを使用するように調整するが、このクラスはfinalと宣言され、サブクラス化することはできません。既定の動作を上書きし、カスタムユーザータイプを使用するサポートはありますか?私が見たものから、

public static UserRequestPostProcessor user(String username) { 
     return new UserRequestPostProcessor(username); 
} 

、私は認証に私のカスタムユーザープリンシパルを設定することができるように@WithSecurityContextと私のテストに注釈を付けるための候補としています。ここで私の懸念は、私は各メソッドの1人のユーザーをテストすることに限定され、これは私がしようとしているもののために拡大しないということです。

複数のカスタムユーザーが行ったリクエストをテストするにはどうすればよいですか?私はこれを行うには、2つの方法を知っ

答えて

1

  1. 私はUserDetailsを実装し、私の カスタムユーザープリンシパルクラスを拡張するクラスを作成することができます。私はこれをパラメータとしてユーザメソッドに として渡すことができました。

  2. ユーザーメソッドを完全に傷つけ、 私のカスタムユーザープリンシパルで既に設定されている認証を渡すことができます。

私は後者と一緒に行った。

protected void performTest(HttpMethod method, String path, Object[] pathVariables, UserRoleEnum role, 
     boolean expectAllowed) throws Exception { 
    mockMvc.perform(buildRequest(method, path, pathVariables).with(authentication(createAuthentication(role)))) 
      .andExpect(expectAllowed ? status().isNotFound() : status().isForbidden()) 
      .andExpect(authenticated().withUsername("user")); 
} 

ノート - buildRequestcreateAuthentication方法は他のすべてのメソッドは、春から提供されているのに対し、私は、作成したヘルパーメソッドです。ヘルパーメソッドはそれぞれMockHttpServletRequestBuilderAuthenticationを返します。

関連する問題