# 在 Spring MVC测试中以用户身份运行测试
通常希望以特定用户的身份运行测试。有两种简单的填充用户的方法:
# Running as a User in Spring MVC Test with RequestPostProcessor
有许多选项可用于将用户关联到当前的HttpServletRequest
。例如,以下将以用户名“user”、密码“password”和角色“role_user”作为用户(不需要存在)运行:
该支持通过将用户关联到HttpServletRequest 来工作。将请求关联到你需要确保的 SecurityContextHolder``SecurityContextPersistenceFilter 与MockMvc 实例相关联。实现此目的的几种方法是: *调用[ 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("/")
// ...
}