Spring 启动 2 测试 Spring 安全
Spring Boot 2 Testing with Spring Security
我在使用 Spring Security 5.1 测试 Spgring Boot 2 应用程序时遇到了一些问题。
问题:我总是收到 403 响应。
以下是我尝试过的两种方法:
1) 通过执行以下操作禁用测试安全性:
@Value("${security.enabled:true}")
private boolean securityEnabled;
@Override
protected void configure(HttpSecurity pHttpSecurity) throws Exception
{
if (!securityEnabled)
{
return;
}
并且仅使用 application.properties 将此变量设置为 false 进行测试。这仍然会导致 403,因为 PreAuthorize 仍然希望您获得授权,并且我在过去禁用安全配置时观察到相同的行为:我还必须注释掉所有 PreAuthorize 注释以在没有安全的情况下手动测试。
2) 运行 测试:
@WithMockUser(username = "admin", roles = "ADMIN")
这个解决方案实际上带来了一个问题,即 PreAuthorize 不会自动附加 ROLE_ 前缀,这实际上是我使用它的原因,因为我的角色没有它要么。为了尝试进行测试 运行 我实际上更改了我正在访问的路由,如果这是唯一的工作方式,我将更改角色名称(但也许 @Secured 也可以解决问题).
这是使用@WithMockUser 时请求的相关部分的样子。
MockHttpServletRequest:
HTTP Method = POST
Request URI = /admin/createUser
Parameters = {}
Headers = {Content-Type=[application/json]}
Body = <no character encoding set>
Session Attrs = {SPRING_SECURITY_CONTEXT=org.springframework.security.core.context.SecurityContextImpl@e0791834:
Authentication: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@e0791834:
Principal: org.springframework.security.core.userdetails.User@586034f:
Username: admin; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true;
credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_ADMIN;
Credentials: [PROTECTED]; Authenticated: true; Details: null; Granted Authorities: ROLE_ADMIN}
我也试过 @Secured 和 @RolesAllowed 有和没有附加 ROLE_ 和相同的行为。 None 其他类似帖子中提出的答案到目前为止有效。
那么,对我做错了什么有什么帮助吗?启用安全性的任何正确测试方法?如果没有,有什么方法可以告诉 Spring 在禁用安全性的情况下忽略 PreAuthorize?
提前致谢!
对于未来的访问者,非常感谢我在这篇文章的相关帖子中找到的这个人(但不是通过搜索之前 >.<) :
基本上我必须添加 .with(csrf())
mvc.perform(post("/admin/createUser").with(csrf())
.contentType(MediaType.APPLICATION_JSON)
.content(jsonNode.toString()))
.andExpect(status().isOk());
我在使用 Spring Security 5.1 测试 Spgring Boot 2 应用程序时遇到了一些问题。
问题:我总是收到 403 响应。
以下是我尝试过的两种方法:
1) 通过执行以下操作禁用测试安全性:
@Value("${security.enabled:true}")
private boolean securityEnabled;
@Override
protected void configure(HttpSecurity pHttpSecurity) throws Exception
{
if (!securityEnabled)
{
return;
}
并且仅使用 application.properties 将此变量设置为 false 进行测试。这仍然会导致 403,因为 PreAuthorize 仍然希望您获得授权,并且我在过去禁用安全配置时观察到相同的行为:我还必须注释掉所有 PreAuthorize 注释以在没有安全的情况下手动测试。
2) 运行 测试:
@WithMockUser(username = "admin", roles = "ADMIN")
这个解决方案实际上带来了一个问题,即 PreAuthorize 不会自动附加 ROLE_ 前缀,这实际上是我使用它的原因,因为我的角色没有它要么。为了尝试进行测试 运行 我实际上更改了我正在访问的路由,如果这是唯一的工作方式,我将更改角色名称(但也许 @Secured 也可以解决问题).
这是使用@WithMockUser 时请求的相关部分的样子。
MockHttpServletRequest:
HTTP Method = POST
Request URI = /admin/createUser
Parameters = {}
Headers = {Content-Type=[application/json]}
Body = <no character encoding set>
Session Attrs = {SPRING_SECURITY_CONTEXT=org.springframework.security.core.context.SecurityContextImpl@e0791834:
Authentication: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@e0791834:
Principal: org.springframework.security.core.userdetails.User@586034f:
Username: admin; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true;
credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_ADMIN;
Credentials: [PROTECTED]; Authenticated: true; Details: null; Granted Authorities: ROLE_ADMIN}
我也试过 @Secured 和 @RolesAllowed 有和没有附加 ROLE_ 和相同的行为。 None 其他类似帖子中提出的答案到目前为止有效。
那么,对我做错了什么有什么帮助吗?启用安全性的任何正确测试方法?如果没有,有什么方法可以告诉 Spring 在禁用安全性的情况下忽略 PreAuthorize?
提前致谢!
对于未来的访问者,非常感谢我在这篇文章的相关帖子中找到的这个人(但不是通过搜索之前 >.<)
基本上我必须添加 .with(csrf())
mvc.perform(post("/admin/createUser").with(csrf())
.contentType(MediaType.APPLICATION_JSON)
.content(jsonNode.toString()))
.andExpect(status().isOk());