Получение 403 запрещено в тесте контроллера загрузки Spring с помощью MockMVCJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Получение 403 запрещено в тесте контроллера загрузки Spring с помощью MockMVC

Сообщение Anonymous »

Я столкнулся с ошибкой 403 Forbidden при запуске теста Spring Boot для моего контроллера настройки с использованием MockMVC. Несмотря на то, что проверка JWT имитирует возврат true, тест по-прежнему завершается неудачей со статусом 403. Ниже приведены соответствующие фрагменты кода для моего контроллера и тестового класса.
SetupController.java:

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

@RestController
@RequestMapping("/rest/setup")
public class SetupController {

@PostMapping("/createSummary")
@ResponseStatus(value = HttpStatus.OK)
@PreAuthorize("hasAuthority('USER') or hasAuthority('ADMIN')")
public void createChallengeSummary(@RequestHeader String Authorization) {
if (!jwtValidator.isValidJWT(Authorization)) {
LOGGER.error("Invalid JWT Token");
return;
}
String userEmail = jwtValidator.getUserEmail(Authorization.substring(7));
LOGGER.info("Creating ChallengeSummary for user with Email: {}", userEmail);
reportsService.createChallengeSummary(userEmail);
}
}
SetupControllerTest.java:

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

@WebMvcTest(SetupController.class)
public class SetupControllerTest {

private final String AUTH_HEADER = "Bearer eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhbGV4QGZobXMuZGUiLCJhdXRoIjoiVVNFUiIsImlhdCI6MTcxNjkwMTAxMiwiZXhwIjo0ODcwNTAxMDEyfQ.YgqbpgTBpRSmPMAY1-t9UVXAvIVigEjKSHeM8axslIGVFUozeacYfb3VLPvGJ99RWf3C8q5UjMmhpBEAPlzVgyHUFhj_6NUHkYuTcFFGIvdAClQ00RIIbNhx0g23PrQFo7AZtF1m6BbLe6QQUU12gEH4XYq4hL0p4BV9iNRnSdSHK-vLGuP9jSLFwOQRzMkWEBMfvn6w4mQWlQuBG9Zi6hjg5b4meOHUvQJeVr_sAHq2e15ig292ndisAVbQ1VP6-91-qpmOQ4-O36o_DUUVCaSDV4Gup9lE4Deu0UPdaYTR0UuSmfZx0e3DnQufwKUokqNUwdgzfRnwLIvXekgwAA";
private final String TEST_USER_EMAIL = "[email protected]";

@BeforeEach
public void setUp() throws Exception {
UserDetails userDetails = User.withUsername(TEST_USER_EMAIL)
.password("***")
.authorities("USER", "ADMIN")
.build();

when(jwtValidator.isValidJWT(any(String.class))).thenReturn(true);
when(jwtValidator.getUserEmail(any(String.class))).thenReturn(TEST_USER_EMAIL);
when(jwtValidator.resolveToken(any(HttpServletRequest.class))).thenReturn(AUTH_HEADER.substring(7));
when(jwtValidator.getAuthentication(any(String.class)))
.thenReturn(new UsernamePasswordAuthenticationToken(userDetails, "",
userDetails.getAuthorities()));
}

@Test
public void testCreateChallengeSummary() throws Exception {
this.mvc.perform(post("/rest/setup/createSummary")
.header("Authorization", AUTH_HEADER))
.andExpect(status().isOk())
.andDo(print());

verify(reportsService).createChallengeSummary(TEST_USER_EMAIL);
}
}
JWTValidator.java:

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

@Component
public class JwtValidator {

public boolean isValidJWT(String jwt) {
try {
Jwts.parser()
.verifyWith(publicKey)
.build()
.parseSignedClaims(jwt);
return true;
} catch (Exception e) {
LOG.info("Token rejected because " + e.getMessage());
throw new InvalidException("JWT invalid");
}
}

public Authentication getAuthentication(String jwt) {
return new UsernamePasswordAuthenticationToken(getUserEmail(jwt), "", getRoles(jwt));
}

public String getUserEmail(String jwt) {
final Jws token = Jwts.parser()
.verifyWith(publicKey)
.build()
.parseSignedClaims(jwt);
final Claims payload = token.getPayload();
return payload.getSubject();
}

/**
* Extracts the user roles from a JWT.
*
* @param jwt
* @return
*/
public Collection getRoles(String jwt) {
Collection result = new ArrayList();
final Jws  token = Jwts.parser()
.verifyWith(publicKey)
.build()
.parseSignedClaims(jwt);
final Claims payload = token.getPayload();
final String authClaim = payload.get("auth", String.class);
if (authClaim.equals("USER")) {
result.add(Role.USER);
} else if (authClaim.equals("ADMIN")) {
result.add(Role.ADMIN);
}
return result;
}

public PublicKey getPublicKey() {
return this.publicKey;
}
}
  • Имитация JwtValidator, чтобы всегда возвращать true для isValidJWT.
  • Проверка правильности передачи заголовка авторизации в запросе.< /li>
    Имитация данных пользователя соответствующими органами.
Проблема:
Несмотря на эти настройки, тест по-прежнему выдает ошибку 403 Forbidden.
Вопросы:
  • Что-то не так с моя тестовая настройка или конфигурация Spring Security?
  • Нужны ли дополнительные конфигурации для Spring Security, чтобы макет настройки работал правильно?
Любая помощь или рекомендации будут очень признательны. Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/786 ... th-mockmvc
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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