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

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

* [在使用RequestPostProcessor的 Spring MVC测试中以用户身份运行](#test-mockmvc-securitycontextholder-rpp)

* [在 Spring MVC测试中以用户身份运行并带有注释](#test-mockmvc-withmockuser)

## Running as a User in Spring MVC Test with RequestPostProcessor

有许多选项可用于将用户关联到当前的`HttpServletRequest`。例如，以下将以用户名“user”、密码“password”和角色“role\_user”作为用户（不需要存在）运行：

|   |该支持通过将用户关联到`HttpServletRequest`来工作。<br/>将请求关联到你需要确保的`SecurityContextHolder``SecurityContextPersistenceFilter`与`MockMvc`实例相关联。<br/>实现此目的的几种方法是：<br/><br/>*调用[`apply(springSecurity())`<br/><br/>*将 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`创建用户的替代方法，你可以使用[测试方法安全性](../method.html)中描述的注释。例如，下面将使用用户名“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("/")
        // ...
}
```

[安全请求后置处理器](request-post-processors.html)[嘲笑CSRF](csrf.html)