Пользовательская аннотация на методы контроллера для перехвата запроса и проверки - PullRequest
0 голосов
/ 30 мая 2018

Я хочу создать аннотацию, которую я буду использовать в методах контроллера для проверки доступа к ресурсу.Я написал перехватчик для перехвата запроса, а также написал код для создания аннотации для их независимых сценариев.Теперь я хочу перехватить запрос, а также принять значения, указанные в аннотации, для дальнейшей обработки.

В идеале

@RequestMapping("/release")
@ValidateAction("resource","release") //custom annotation that will accept two strings
public ResponseEntity releaseSoftware(Request request){
}

Исходя из вышеизложенного, я должен взять эти два значения из @ValidateAction и отправитьзапросить у другого сервера авторизации авторизацию действия, если у пользователя есть к нему доступ (запрос содержит маркер доступа oauth, который будет использоваться для авторизации), и вернуть true, если у пользователя есть доступ, в противном случае выдается исключение AcceeDenied.Кто-нибудь может указать мне правильное направление работы в среде загрузки Spring

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Лучший способ добиться этого - использование аспектов Spring AOP.

Предположим, у вас есть аннотация, подобная этой

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidateAction {

  String resource();
  String release();
}

Затем напишите аспект, подобный этому

@Aspect
@Component
public class AspectClass {

  @Around(" @annotation(com.yourpackage.ValidateAction)")
  public Object validateAspect(ProceedingJoinPoint pjp) throws Throwable {
    MethodSignature signature = (MethodSignature) pjp.getSignature();
    Method method = signature.getMethod();

    ValidateAction validateAction = method.getAnnotation(ValidateAction.class);
    String release = validateAction.release();
    String resource = validateAction.resource();


    // Call your Authorization server and check if all is good
    if( hasAccess)
      pjp.proceed();

    .......
  }
}

Элемент управления придет к методу validateAspect, когда любой метод, который являетсяс пометкой @ValidateAction называется.Здесь вы фиксируете значения аннотаций, как показано, и делаете необходимую проверку.

Убедитесь, что у вас есть нужные зависимости, и этот импорт

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
0 голосов
/ 30 мая 2018

Вы можете сделать это с помощью Spring AOP:

Сначала добавьте spring-aop зависимость:

compile 'org.springframework.boot:spring-boot-starter-aop' // Mine using gradle

В вашем классе @Configuration добавьте @EnableAspectJAutoProxy:

@Configuration
@EnableAspectJAutoProxy
public class Application {
   ....
}

Создание обработчика аннотации:

@Aspect
@Component // This @Component is required in spring aop
public class ValidateActionHandler {
    @Around("execution(@your.path.ValidateAction * *(..)) && @annotation(validateAction)")
    public Object doValidate(ProceedingJoinPoint pjp, ValidateAction retryConfig) throws Throwable {
       // Your logic here
       // then
       return pjp.proceed();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...