Интеграционный тест Java Spring: Mock BearerTokenAuthentication с Oauth2JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Интеграционный тест Java Spring: Mock BearerTokenAuthentication с Oauth2

Сообщение Anonymous »

У меня возникла проблема при запуске интеграционных тестов на моем веб-уровне.
Я хочу имитировать эту конечную точку:

Код: Выделить всё

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 и преобразую его в объект аутентификации, чтобы поместить его в контекст безопасности Springs.
Теперь что я вроде возникли проблемы с его тестированием.
Я издеваюсь над 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»