Я хочу имитировать эту конечную точку:
Код: Выделить всё
public ResponseEntity getBooks(BearerTokenAuthentication auth, @AuthenticationPrincipal OidcUser principal) {...}
У меня также есть следующая конфигурация для цепочка фильтров безопасности:
Код: Выделить всё
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf(CsrfConfigurer::disable)
.authorizeHttpRequests((authz) ->
authz.anyRequest().authenticated()
).oauth2ResourceServer(oauth2 -> oauth2.jwt().decoder(jwtDecoder()).jwtAuthenticationConverter(new JwtBearerTokenAuthenticationConverter()));
return http.build();
}
public JwtDecoder jwtDecoder() {
return (token) -> {
JWT jwt = null;
try {
jwt = JWTParser.parse(token);
Map headers = new LinkedHashMap(jwt.getHeader().toJSONObject());
Map claims = jwt.getJWTClaimsSet().getClaims();
return new Jwt(token, null, null, headers, claims);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
};
}
Теперь что я вроде возникли проблемы с его тестированием.
Я издеваюсь над jwt, используя c4_soft.springaddons @WithJwt(), куда я передаю некоторый стандартный jwt с фиктивными значениями.
Вот как сейчас выглядит мой тест:
Код: Выделить всё
@SpringBootTest
@AutoConfigureMockMvc
public class BookApiTest {
private final MockMvc mockMvc;
@MockBean
FeignClient feignClient;
@MockBean
JwtDecoder jwtDecoder;
@Autowired
BookApiTest(MockMvc mockMvc) {
this.mockMvc = mockMvc;
}
@Test
@WithJwt("jwt.json")
public void testGetBooks() throws Exception {
ResponseEntity responseEntity = ResponseEntity.ok(List.of(sampleBooks));
when(feignClient.getBooks()).thenReturn(responseEntity);
this.mockMvc.perform(MockMvcRequestBuilders.get("/books")
.with(SecurityMockMvcRequestPostProcessors.csrf()))
.andExpect(status().isOk());
}
}
jakarta.servlet.ServletException: ошибка обработки запроса: java.lang.IllegalStateException: текущий субъект пользователя не относится к типу [org.springframework.security.oauth2.server.resource] .authentication.BearerTokenAuthentication]: JwtAuthenticationToken [Principal=org.springframework.security.oauth2.jwt.Jwt@a795d843, Credentials=[PROTECTED], Authenticated=true, Details=null, предоставленные полномочия=[]]
И это меня раздражает.
При условии, что у меня есть действительный jwt и я использую приведенную выше конфигурацию с помощью @autoconfiguremvc, я ожидаю, что jwt будет автоматически преобразован в объект аутентификации и предоставлен контекст безопасности.
Почему он терпит неудачу во время теста, я не понимаю.
Документация Spring, статьи на SO или других сайтах пока не смогли мне помочь.< /p>
Может быть, кто-то заметит важную ошибку или что-то, чего мне не хватает.
Буду благодарен.
Подробнее здесь: https://stackoverflow.com/questions/791 ... ith-oauth2
Мобильная версия