@WithMockUser 忽略用户名、密码字段?
Posted
技术标签:
【中文标题】@WithMockUser 忽略用户名、密码字段?【英文标题】:@WithMockUser ignores username, password fields? 【发布时间】:2016-11-28 07:34:25 【问题描述】:我正在使用@WithMockUser
在一个简单的 Spring Boot Web 服务中测试使用基本身份验证保护的控制器方法。我的注释看起来像:
@WithMockUser(username = 'admin', password = 'mypassword', roles = ['ADMIN'])
然而,似乎用户名和密码字段被忽略了。即使我指定了错误的用户名或密码,测试也会通过。但是,角色字段似乎已被使用,并且测试失败并提供了无效角色。
也许我误解了这个注释的作用,但我应该能够使用它来验证提供给安全方法的不正确凭据的行为吗?
谢谢!
--约翰
【问题讨论】:
不,你不应该。它的作用是用给定的用户重新填充SecurityContext
。它不允许您测试任何其他内容。如果需要,您需要使用 Springs Mock MVC 测试支持进行系统测试或完整集成测试,包括手动注册您的安全配置。
【参考方案1】:
如果您使用的是 Spring MVC 测试(即MockMvc
),您将执行以下操作:
mvc.perform(get("/").with(httpBasic("user","password"))) // ...
这在 Spring Security 参考手册的Testing HTTP Basic Authentication 部分中有记录。
如果您已将测试配置为使用嵌入式 Servlet 容器启动 Spring Boot,则可以使用 Spring Boot 的 TestRestTemplate,它支持“基本 HTTP 身份验证(使用用户名和密码)”。
【讨论】:
【参考方案2】:这也发生在我身上。我认为 @WithMockUser 足以测试安全服务。不需要用户/密码/角色。我在我的案例中验证了这个场景。
【讨论】:
请不要用假设回答以上是关于@WithMockUser 忽略用户名、密码字段?的主要内容,如果未能解决你的问题,请参考以下文章
Typescript Mongoose 以类型安全的方式忽略查询结果中的某些字段
用于 Selenium 测试的 Spring Security @WithMockUser