@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 忽略用户名、密码字段?的主要内容,如果未能解决你的问题,请参考以下文章

@WithMockUser 在并行上下文中

Typescript Mongoose 以类型安全的方式忽略查询结果中的某些字段

Json.net 忽略实体某些属性的序列化

用于 Selenium 测试的 Spring Security @WithMockUser

Spring Boot 2、Spring Security 5 和 @WithMockUser

@WithMockUser 在集成测试中不起作用 - Spring boot