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());