【问题标题】:Spring Boot WebMvcTest returns 302 instead of 401 for GET methodsSpring Boot WebMvcTest 为 GET 方法返回 302 而不是 401
【发布时间】:2021-08-26 11:54:02
【问题描述】:

我有一个带有 REST 端点的应用程序,这些端点通过JWT 身份验证(外部资源服务器)进行保护。在将我的项目从 spring-boot 2.2.7 升级到 2.4.3 之后,一些 WebMvcTest 集成测试失败了。具体来说,没有 JWT 令牌的 GET 请求的测试用例 - 以前它们将返回 401 UNAUTHORIZED,现在它们将 302 REDIRECT 返回到 http://localhost/oauth2/authorization/keycloak

@Test
void shouldNotAllowAccessForUnauthenticatedUsers() throws Exception {
    // given
    var params = createParams();

    // when / then
    mockMvc.perform(get(MY_URI)
            .params(params)
            .contentType(MediaType.APPLICATION_JSON)
            .content(new byte[0]))
            .andExpect(status().isUnauthorized());
}

没有导入自定义 Web 安全配置,仅导入 @WebMvcTest@AutoConfigureMockMvc 以及相关控制器和映射器 bean 的 @ContextConfiguration

POST 未经身份验证的测试中的方法返回 403(与升级前一样)。此问题仅在测试中出现 - 当应用程序运行时,调用没有令牌的任何端点会导致 401

有没有办法将WebMvcTest 配置为返回401 而不是302

【问题讨论】:

  • 您使用的是什么版本的 Keyclock?您是否验证过它与 Spring Boot 2.4.x 兼容?

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


【解决方案1】:

Andy Wilkinson 的问题启发我深入研究,因为没有真正将 Keycloak 适配器添加为显式依赖项(仅 spring-boot-starter-securityspring-boot-starter-oauth2-clientspring-boot-starter-oauth2-resource-server),但此处的配置中提到了 keycloak

  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: ...
      client:
        registration:
          keycloak:
            client-id: ...
            client-secret: ...
            authorization-grant-type: ...
            scope: ...
        provider:
          keycloak:
            authorization-uri: ...
            token-uri: ...

对应用程序端点的请求使用来自 issuer-uri 的 JWT 令牌进行身份验证,但对其他服务的 HTTP 客户端调用使用 Keycloak 中的客户端注册进行身份验证(用于服务到服务身份验证)。

无论如何,我相信升级后的这种行为变化是由于Spring Boot 2.3 中引入的一个功能,特别是:“@WebMvcTest 中的 OAuth2 参数绑定”。 OAuth2 的自动配置现在包含在 @WebMvcTest 中,这导致此测试尝试使用客户端配置(在运行时仅用于服务到服务)重定向到 keycloak。

我通过注释测试类解决了这个问题:

@ImportAutoConfiguration(exclude = {OAuth2ClientAutoConfiguration.class, OAuth2ResourceServerAutoConfiguration.class})

(也必须排除资源服务器配置才能正确处理模拟的 JWT。)

也许有人会觉得这很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2019-09-30
    • 1970-01-01
    • 2019-03-23
    相关资源
    最近更新 更多