Я создал свою пользовательскую проверку для проверки заголовков запросов. Моя аннотация добавлена для метода контроллера, и я передаю необходимые значения заголовков,
@Constraint(validatedBy = AuthorizationValidator.class)
@Target(METHOD)
@Retention(RUNTIME)
public @interface Auth {
@AliasFor("roles")
String[] roles() default {};
}
И класс проверки:
@Log4j2
public class AuthorizationValidator implements ConstraintValidator<Auth, Object> {
private String[] requiredRoles = {};
@Override
public void initialize(Auth constraintAnnotation) {
requiredRoles = constraintAnnotation.roles();
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
log.info("Checking roles");
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
List<String> role = Arrays.asList(request.getHeader("role").split("-"));
if (!role.contains(Arrays.asList(requiredRoles))) {
throw new AuthorizationException();
}
return true;
}
И ядобавьте аннотацию к моему классу контроллера следующим образом:
@GetMapping("/{username}")
@Auth(roles = {"myRole"})
public ResponseEntity<UserDto> getUser() {
log.info("Executing controller method");
myService.executeMethod();
return ResponseEntity.
status(HttpStatus.OK)
.build();
}
Помимо класса контроллера я также добавил аннотацию @ Validated
Проблема в том, что мне нужен мой AuthorizationValidatorвыполнить до того, как метод контроллера начнет делать что-то, но по какой-то причине сейчас в журналах я всегда вижу:
"Executing controller method"
"Checking roles"
Есть ли способ заставить выполнение проверки ограничения?