[英]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 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
加上相關@ContextConfiguration
和映射器 bean 的 @ContextConfiguration。
沒有身份驗證的測試中的POST
方法返回403
(與升級之前一樣)。 此問題僅在測試中出現 - 當應用程序運行時,調用任何沒有令牌的端點都會導致401
。
有沒有辦法將WebMvcTest
配置為返回401
而不是302
?
Andy Wilkinson 的問題啟發了我深入研究這個問題,因為沒有真正將 Keycloak 適配器添加為顯式依賴項(只有spring-boot-starter-security
、 spring-boot-starter-oauth2-client
、 spring-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.