SecurityMockMvcResultMatchers
有时需要对请求进行各种安全相关的断言。为满足这一需求,Spring Security 测试支持实现了 Spring MVC 测试的 ResultMatcher 接口。要使用 Spring Security 的 ResultMatcher 实现,请确保使用以下静态导入:
- Java
- Kotlin
import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.*;
import org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.*
未认证断言
有时,断言 MockMvc 调用的结果没有关联已认证用户可能很有价值。例如,你可能希望测试提交无效的用户名和密码,并验证没有用户被认证。使用 Spring Security 的测试支持,你可以轻松实现这一点,例如通过以下方式:
- Java
- Kotlin
mvc
.perform(formLogin().password("invalid"))
.andExpect(unauthenticated());
mvc
.perform(formLogin().password("invalid"))
.andExpect { unauthenticated() }
认证断言
我们经常需要确认已认证用户的存在。例如,我们可能希望验证认证是否成功。可以通过以下代码片段来验证基于表单的登录是否成功:
- Java
- Kotlin
mvc
.perform(formLogin())
.andExpect(authenticated());
mvc
.perform(formLogin())
.andExpect { authenticated() }
如果我们想要断言用户的角色,可以如下所示改进之前的代码:
- Java
- Kotlin
mvc
.perform(formLogin().user("admin"))
.andExpect(authenticated().withRoles("USER","ADMIN"));
mvc
.perform(formLogin())
.andExpect { authenticated().withRoles("USER","ADMIN") }
或者,我们可以验证用户名:
- Java
- Kotlin
mvc
.perform(formLogin().user("admin"))
.andExpect(authenticated().withUsername("admin"));
mvc
.perform(formLogin().user("admin"))
.andExpect { authenticated().withUsername("admin") }
我们也可以组合断言:
- Java
- Kotlin
mvc
.perform(formLogin().user("admin"))
.andExpect(authenticated().withUsername("admin").withRoles("USER", "ADMIN"));
mvc
.perform(formLogin().user("admin"))
.andExpect { authenticated().withUsername("admin").withRoles("USER", "ADMIN") }
我们还可以对身份验证进行任意断言
- Java
- Kotlin
mvc
.perform(formLogin())
.andExpect(authenticated().withAuthentication(auth ->
assertThat(auth).isInstanceOf(UsernamePasswordAuthenticationToken.class)));
mvc
.perform(formLogin())
.andExpect {
authenticated().withAuthentication { auth ->
assertThat(auth).isInstanceOf(UsernamePasswordAuthenticationToken::class.java) }
}
}