最新の安定バージョンについては、Spring Security 6.3.1 を使用してください!

Spring MVC テストでユーザーとしてテストを実行する

多くの場合、特定のユーザーとしてテストを実行することが望ましいです。ユーザーにデータを入力する簡単な方法は 2 つあります。

RequestPostProcessor を使用した Spring MVC テストでユーザーとして実行

ユーザーを現在の HttpServletRequest に関連付けるためのオプションがいくつかあります。次の例は、ユーザー名が user、パスワードが password、ロールが ROLE_USER のユーザー(存在する必要はありません)として実行されます。

  • Java

  • Kotlin

mvc
	.perform(get("/").with(user("user")))
mvc.get("/") {
    with(user("user"))
}

このサポートは、ユーザーを HttpServletRequest に関連付けることによって機能します。リクエストを SecurityContextHolder に関連付けるには、SecurityContextPersistenceFilter が MockMvc インスタンスに関連付けられていることを確認する必要があります。これは、いくつかの方法で行うことができます。

  • apply(springSecurity()) の呼び出し

  • Spring Security の FilterChainProxy を MockMvc に追加

  • SecurityContextPersistenceFilter を MockMvc インスタンスに手動で追加すると、MockMvcBuilders.standaloneSetup を使用する際に意味があります。

簡単にカスタマイズできます。例: 以下は、ユーザー名 "admin"、パスワード "pass"、ロール "ROLE_USER" および "ROLE_ADMIN" を持つユーザー(存在する必要はありません)として実行されます。

  • Java

  • Kotlin

mvc
	.perform(get("/admin").with(user("admin").password("pass").roles("USER","ADMIN")))
mvc.get("/admin") {
    with(user("admin").password("pass").roles("USER","ADMIN"))
}

使用したいカスタム UserDetails がある場合は、それも簡単に指定できます。例: 以下は、指定された UserDetails (存在する必要はありません)を使用して、指定された UserDetails のプリンシパルを持つ UsernamePasswordAuthenticationToken で実行します。

  • Java

  • Kotlin

mvc
	.perform(get("/").with(user(userDetails)))
mvc.get("/") {
    with(user(userDetails))
}

次を使用して匿名ユーザーとして実行できます。

  • Java

  • Kotlin

mvc
	.perform(get("/").with(anonymous()))
mvc.get("/") {
    with(anonymous())
}

これは、デフォルトのユーザーで実行していて、匿名ユーザーとしていくつかのリクエストを処理したい場合に特に便利です。

カスタム Authentication (存在する必要はありません)が必要な場合は、次を使用して行うことができます。

  • Java

  • Kotlin

mvc
	.perform(get("/").with(authentication(authentication)))
mvc.get("/") {
    with(authentication(authentication))
}

以下を使用して SecurityContext をカスタマイズすることもできます。

  • Java

  • Kotlin

mvc
	.perform(get("/").with(securityContext(securityContext)))
mvc.get("/") {
    with(securityContext(securityContext))
}

MockMvcBuilders のデフォルトリクエストを使用することで、すべてのリクエストに対して特定のユーザーとして実行することも保証できます。例: 以下は、ユーザー名 "admin"、パスワード "password"、ロール "ROLE_ADMIN" を持つユーザー(存在する必要はありません)として実行されます。

  • Java

  • Kotlin

mvc = MockMvcBuilders
		.webAppContextSetup(context)
		.defaultRequest(get("/").with(user("user").roles("ADMIN")))
		.apply(springSecurity())
		.build();
mvc = MockMvcBuilders
    .webAppContextSetup(context)
    .defaultRequest<DefaultMockMvcBuilder>(get("/").with(user("user").roles("ADMIN")))
    .apply<DefaultMockMvcBuilder>(springSecurity())
    .build()

多くのテストで同じユーザーを使用していることがわかった場合は、ユーザーをメソッドに移動することをお勧めします。例: CustomSecurityMockMvcRequestPostProcessors という名前の独自のクラスで以下を指定できます。

  • Java

  • Kotlin

public static RequestPostProcessor rob() {
	return user("rob").roles("ADMIN");
}
fun rob(): RequestPostProcessor {
    return user("rob").roles("ADMIN")
}

これで、CustomSecurityMockMvcRequestPostProcessors で静的インポートを実行し、テスト内でそれを使用できます。

  • Java

  • Kotlin

import static sample.CustomSecurityMockMvcRequestPostProcessors.*;

...

mvc
	.perform(get("/").with(rob()))
import sample.CustomSecurityMockMvcRequestPostProcessors.*

//...

mvc.get("/") {
    with(rob())
}

アノテーション付きの Spring MVC テストでユーザーとして実行

RequestPostProcessor を使用してユーザーを作成する代わりに、メソッドのセキュリティテストで説明されているアノテーションを使用できます。例: 以下は、ユーザー名が "user"、パスワードが "password"、ロールが "ROLE_USER" のユーザーでテストを実行します。

  • Java

  • Kotlin

@Test
@WithMockUser
public void requestProtectedUrlWithUser() throws Exception {
mvc
		.perform(get("/"))
		...
}
@Test
@WithMockUser
fun requestProtectedUrlWithUser() {
    mvc
        .get("/")
        // ...
}

または、次のコマンドは、ユーザー名が "user"、パスワードが "password"、ロールが "ROLE_ADMIN" のユーザーでテストを実行します。

  • Java

  • Kotlin

@Test
@WithMockUser(roles="ADMIN")
public void requestProtectedUrlWithUser() throws Exception {
mvc
		.perform(get("/"))
		...
}
@Test
@WithMockUser(roles = ["ADMIN"])
fun requestProtectedUrlWithUser() {
    mvc
        .get("/")
        // ...
}