4

Spring MVC コントローラーの単体テストをセットアップしており、Spring MVC テスト フレームワークを活用しようとしています。コントローラーの各エンドポイントに対して、指定された権限を持つユーザーのみがアクセスできるようにしたいと考えています。私の問題は、カスタムの User 実装を使用し、これを回避するための mockMvc ツールを使用すると、クラス キャスト例外が発生することです。

リクエストごとに、次のようになると思います。

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

上記のステートメントを微調整して、カスタム ユーザー プリンシパルを指定したいと思います。以下のSpringのユーザーメソッドを参照してください。私が最初に考えたのは、クラスをオーバーライドしてUserRequestPostProcessor微調整し、標準の Spring Security ユーザーの代わりにカスタム ユーザー タイプを使用することでしたが、このクラスは final として宣言されており、サブクラス化できません。デフォルトの動作をオーバーライドし、カスタム ユーザー タイプを使用するためのサポートはありますか??

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

私が見てきたことから、認証でカスタム ユーザー プリンシパルを設定できるように、 @WithSecurityContextでテストに注釈を付ける候補です。ここでの私の懸念は、メソッドごとに 1 人のユーザーをテストすることに制限されることであり、これは私がやろうとしていることに対応していません。

複数のカスタム ユーザーによるリクエストをテストするにはどうすればよいですか?

4

1 に答える 1

2

これを行う2つの方法を学びました:

  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"));
}

注 -buildRequestおよびcreateAuthenticationメソッドは私が作成したヘルパー メソッドですが、他のすべてのメソッドは Spring によって提供されます。ヘルパー メソッドはそれぞれMockHttpServletRequestBuilderと を返しAuthenticationます。

于 2016-04-12T02:52:32.030 に答える