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);
}
}
Код: Выделить всё
@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);
}
}
Код: Выделить всё
@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