【问题标题】:Spring Boot 2 Testing with Spring Security [duplicate]使用 Spring Security 进行 Spring Boot 2 测试 [重复]
【发布时间】:2019-04-09 15:47:09
【问题描述】:

我在使用 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;
    }

并且仅在将此变量设置为 false 的情况下使用 application.properties 进行测试。这仍然会导致 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_ 和相同的行为。到目前为止,其他类似帖子中提出的答案都没有奏效。


那么,对我做错了什么有帮助吗?启用安全性的任何正确测试方式?如果没有,如果禁用安全性,有什么方法可以告诉 Spring 忽略 PreAuthorize?

提前致谢!

【问题讨论】:

  • 不,我检查了这个并没有工作。问题是我在模拟请求时没有 with(csrf())。
  • 你不是在回答中写下这是完全相同的问题吗?
  • 我的错,我链接了错误的帖子。在答案中修复了这个问题。

标签: java spring-boot testing spring-security spring-security-test


【解决方案1】:

对于未来的访问者,非常感谢我在这篇文章的相关帖子中找到的这个人(但不是之前搜索过>.exact same problem:

基本上我必须添加 .with(csrf())

    mvc.perform(post("/admin/createUser").with(csrf())
            .contentType(MediaType.APPLICATION_JSON)
            .content(jsonNode.toString()))
            .andExpect(status().isOk());

【讨论】:

  • 在最近的 spring 安全版本中,做 post 请求时必须使用 csrf
猜你喜欢
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
  • 2018-01-02
  • 1970-01-01
  • 2019-02-18
  • 2010-09-26
  • 2015-08-12
相关资源
最近更新 更多