簡體   English   中英

Spring Boot WebMvcTest 返回 302 而不是 GET 方法的 401

[英]Spring Boot WebMvcTest returns 302 instead of 401 for GET methods

我有一個帶有 REST 端點的應用程序,這些端點通過JWT身份驗證(外部資源服務器)進行保護。 在將我的項目從 spring-boot 2.2.7 升級到 2.4.3 之后,一些WebMvcTest集成測試失敗了。 具體來說,沒有JWT令牌的GET請求的測試用例 - 以前它們將返回401 UNAUTHORIZED UNAUTHORIZED ,現在它們返回302 REDIRECThttp://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加上相關@ContextConfiguration和映射器 bean 的 @ContextConfiguration。

沒有身份驗證的測試中的POST方法返回403 (與升級之前一樣)。 此問題僅在測試中出現 - 當應用程序運行時,調用任何沒有令牌的端點都會導致401

有沒有辦法將WebMvcTest配置為返回401而不是302

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。

我通過注釋測試 class 解決了這個問題:

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

(資源服務器配置也必須被排除在外,才能正確處理模擬的 JWT。)

也許有人會覺得這很有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM