Spring 安全单元测试 - MockMvc 使用自定义用户执行测试
Spring Security Unit Test - MockMvc perform test with custom user
我正在为我的 Spring MVC 控制器设置单元测试,我正在尝试利用 Spring MVC 测试框架。对于我的控制器中的每个端点,我想确保只有具有指定权限的用户才能访问。我的问题是我使用自定义用户实现并在围绕此使用 mockMvc 工具时得到 class 转换异常。
对于每个请求,我希望它看起来像这样:
mockMvc.perform(MockMvcRequestBuilders.get(path).with(user("user").authorities(authorities)))
.andExpect(status().isOk())
.andExpect(authenticated().withUsername("user"));
我想以某种方式调整上述语句以指定我的自定义用户主体。请参阅下面 Spring 的用户方法。我的第一个想法是我会覆盖 class UserRequestPostProcessor
并调整它,以便它使用我的自定义用户类型而不是标准的 Spring 安全用户,但是这个 class 被声明作为最终版本,不能被 subclassed。是否支持覆盖默认行为和使用自定义用户类型?
public static UserRequestPostProcessor user(String username) {
return new UserRequestPostProcessor(username);
}
据我所知,我是用 @WithSecurityContext 注释我的测试的候选人,这样我就可以在身份验证中设置我的自定义用户主体。我在这里担心的是,我将仅限于为每种方法测试一个用户,而这并不适合我正在尝试做的事情。
如何测试多个自定义用户发出的请求?
我学到了两种方法:
我可以创建一个 class 来实现 UserDetails 并扩展我的
自定义用户主体 class。然后我可以将其作为参数传递
到用户方法。
我可以把用户方法全部改掉,然后传入我的
已使用我的自定义用户主体设置身份验证。
我选择了后者。
protected void performTest(HttpMethod method, String path, Object[] pathVariables, UserRoleEnum role,
boolean expectAllowed) throws Exception {
mockMvc.perform(buildRequest(method, path, pathVariables).with(authentication(createAuthentication(role))))
.andExpect(expectAllowed ? status().isNotFound() : status().isForbidden())
.andExpect(authenticated().withUsername("user"));
}
注意 - buildRequest
和 createAuthentication
方法是我创建的辅助方法,而所有其他方法均由 Spring 提供。辅助方法 return MockHttpServletRequestBuilder
和 Authentication
分别为
我正在为我的 Spring MVC 控制器设置单元测试,我正在尝试利用 Spring MVC 测试框架。对于我的控制器中的每个端点,我想确保只有具有指定权限的用户才能访问。我的问题是我使用自定义用户实现并在围绕此使用 mockMvc 工具时得到 class 转换异常。
对于每个请求,我希望它看起来像这样:
mockMvc.perform(MockMvcRequestBuilders.get(path).with(user("user").authorities(authorities)))
.andExpect(status().isOk())
.andExpect(authenticated().withUsername("user"));
我想以某种方式调整上述语句以指定我的自定义用户主体。请参阅下面 Spring 的用户方法。我的第一个想法是我会覆盖 class UserRequestPostProcessor
并调整它,以便它使用我的自定义用户类型而不是标准的 Spring 安全用户,但是这个 class 被声明作为最终版本,不能被 subclassed。是否支持覆盖默认行为和使用自定义用户类型?
public static UserRequestPostProcessor user(String username) {
return new UserRequestPostProcessor(username);
}
据我所知,我是用 @WithSecurityContext 注释我的测试的候选人,这样我就可以在身份验证中设置我的自定义用户主体。我在这里担心的是,我将仅限于为每种方法测试一个用户,而这并不适合我正在尝试做的事情。
如何测试多个自定义用户发出的请求?
我学到了两种方法:
我可以创建一个 class 来实现 UserDetails 并扩展我的 自定义用户主体 class。然后我可以将其作为参数传递 到用户方法。
我可以把用户方法全部改掉,然后传入我的 已使用我的自定义用户主体设置身份验证。
我选择了后者。
protected void performTest(HttpMethod method, String path, Object[] pathVariables, UserRoleEnum role,
boolean expectAllowed) throws Exception {
mockMvc.perform(buildRequest(method, path, pathVariables).with(authentication(createAuthentication(role))))
.andExpect(expectAllowed ? status().isNotFound() : status().isForbidden())
.andExpect(authenticated().withUsername("user"));
}
注意 - buildRequest
和 createAuthentication
方法是我创建的辅助方法,而所有其他方法均由 Spring 提供。辅助方法 return MockHttpServletRequestBuilder
和 Authentication
分别为