# 在 Spring MVC测试中以用户身份运行测试

通常希望以特定用户的身份运行测试。有两种简单的填充用户的方法:

# Running as a User in Spring MVC Test with RequestPostProcessor

有许多选项可用于将用户关联到当前的HttpServletRequest。例如,以下将以用户名“user”、密码“password”和角色“role_user”作为用户(不需要存在)运行:

该支持通过将用户关联到HttpServletRequest来工作。
将请求关联到你需要确保的SecurityContextHolder``SecurityContextPersistenceFilterMockMvc实例相关联。
实现此目的的几种方法是:

*调用[apply(springSecurity())

*将 Spring 安全性的FilterChainProxy添加到<32">r=R=”42“/>”43“/>r=”gt=34"实例可能具有意义使用MockMvcBuilders.standaloneSetup

Java

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

Kotlin

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

你可以轻松地进行自定义。例如,以下内容将以用户名“admin”、密码“pass”以及角色“role_user”和“role_admin”的形式(不需要存在)运行。

Java

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

Kotlin

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

如果你有一个想要使用的自定义UserDetails,那么你也可以轻松地指定它。例如,下面将使用指定的UserDetails(不需要存在)来运行具有指定的UsernamePasswordAuthenticationToken的主体的UserDetails:

Java

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

Kotlin

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

你可以使用以下方式以匿名用户的身份运行:

Java

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

Kotlin

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

如果你运行的是一个默认用户,并且希望以匿名用户的身份处理一些请求,那么这一点尤其有用。

如果你想要自定义Authentication(它不需要存在),可以使用以下方法来实现:

Java

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

Kotlin

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

你甚至可以使用以下方法自定义SecurityContext:

Java

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

Kotlin

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

通过使用MockMvcBuilders的默认请求,我们还可以确保每个请求都以特定用户的身份运行。例如,以下内容将以用户名“admin”、密码“password”和角色“role_admin”的用户身份(不需要存在)运行:

Java

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

Kotlin

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

如果你发现在许多测试中使用的是同一个用户,建议将该用户移动到一个方法。例如,你可以在自己的类CustomSecurityMockMvcRequestPostProcessors中指定以下内容:

Java

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

Kotlin

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

现在,你可以在CustomSecurityMockMvcRequestPostProcessors上执行静态导入,并在测试中使用它:

Java

import static sample.CustomSecurityMockMvcRequestPostProcessors.*;

...

mvc
	.perform(get("/").with(rob()))

Kotlin

import sample.CustomSecurityMockMvcRequestPostProcessors.*

//...

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

# Running as a User in Spring MVC Test with Annotations

作为使用RequestPostProcessor创建用户的替代方法,你可以使用测试方法安全性中描述的注释。例如,下面将使用用户名“user”、密码“password”和角色“role_user”对用户运行测试:

Java

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

Kotlin

@Test
@WithMockUser
fun requestProtectedUrlWithUser() {
    mvc
        .get("/")
        // ...
}

或者,下面将使用用户名“user”、密码“password”和角色“role_admin”对用户运行测试:

Java

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

Kotlin

@Test
@WithMockUser(roles = ["ADMIN"])
fun requestProtectedUrlWithUser() {
    mvc
        .get("/")
        // ...
}

安全请求后置处理器嘲笑CSRF