복붙노트

[SPRING] Spring AOP : advice 메소드의 주석을 얻는 법

SPRING

Spring AOP : advice 메소드의 주석을 얻는 법

Spring / AOP 및 주석을 사용하여 선언적 보안을 구현하고 싶습니다. 다음 코드 샘플에서 볼 수 있듯이 권고 된 메소드를 실행할 수있는 사용자를 정의하기위한 매개 변수 "allowedRoles"가있는 Restricted Annotations가 있습니다.

    @Restricted(allowedRoles="jira-administrators")
        public void setPassword(...) throws UserMgmtException {             
               // set password code
               ...
        }

자, 문제는 내 조언에 정의 된 주석에 대한 액세스 권한이 없다는 것입니다.

public Object checkPermission(ProceedingJoinPoint pjp) throws Throwable {

    Signature signature = pjp.getSignature();
    System.out.println("Allowed:" + rolesAllowedForJoinPoint(pjp));
            ...
}

private Restricted rolesAllowedForJoinPoint(ProceedingJoinPoint thisJoinPoint)
        {
            MethodSignature methodSignature = (MethodSignature) thisJoinPoint.getSignature();
            Method targetMethod = methodSignature.getMethod();

            return targetMethod.getAnnotation(Restricted.class);
        }

위의 메서드는 항상 null을 반환합니다 (전혀 주석이 없습니다). 이 간단한 해결책이 있습니까?

AspectJ 에이전트 사용에 관해 뭔가 읽었지만이 에이전트를 사용하지 않기를 바란다.

해결법

  1. ==============================

    1.@Restricted가 주석입니다. 그렇다면 다음 사항을 확인하십시오.

    @Restricted가 주석입니다. 그렇다면 다음 사항을 확인하십시오.

    @Retention(RetentionPolicy.RUNTIME)
    

    귀하의 특수 효과 정의에. 즉, 런타임에 주석이 유지됩니다.

  2. ==============================

    2.어노테이션 보존을 런타임으로 변경 한 후에도 여전히 문제가 발생하는 사용자에게는 동일한 문제가있을 수 있습니다. getMethod ()는 구현 클래스 대신 인터페이스 메소드를 반환합니다. 따라서 클래스에 주석이있는 경우 자연스럽게 인터페이스 메소드의 getAnnotations ()는 null을 반환합니다.

    어노테이션 보존을 런타임으로 변경 한 후에도 여전히 문제가 발생하는 사용자에게는 동일한 문제가있을 수 있습니다. getMethod ()는 구현 클래스 대신 인터페이스 메소드를 반환합니다. 따라서 클래스에 주석이있는 경우 자연스럽게 인터페이스 메소드의 getAnnotations ()는 null을 반환합니다.

    다음 해결책은이 문제를 해결했습니다.

    final String methodName = pjp.getSignature().getName();
    final MethodSignature methodSignature = (MethodSignature)pjp.getSignature();
    Method method = methodSignature.getMethod();
    if (method.getDeclaringClass().isInterface()) {
        method = pjp.getTarget().getClass().getDeclaredMethod(methodName, method.getParameterTypes());    
    }
    

    원한다면 여기에서도 인터페이스 주석을 처리 할 수 ​​있습니다.

    더 많은 코멘트가 있습니다. ProceedingJoinPoint에서 템플릿 메서드 인스턴스 가져 오기

    올렉

  3. ==============================

    3.Bozho와 같은 보존 정책을 변경 한 후에도 annotation get null에 대한 호출은 null을 반환합니다.

    Bozho와 같은 보존 정책을 변경 한 후에도 annotation get null에 대한 호출은 null을 반환합니다.

    targetMethod.getAnnotation(Restricted.class);
    

    내가 찾은 것은 주석을 묶어야한다는 것입니다. 주어진 인터페이스는 다음과 같이 선언됩니다 :

     @Retention(RetentionPolicy.RUNTIME)
     public @interface Restricted {
         String[] allowedRoles();
      }
    

    조언은 다음과 같이 선언해야합니다.

           @Before("@annotation( restrictedAnnotation )")
           public Object processRequest(final ProceedingJoinPoint pjp, Restricted restrictedAnnotation) throws Throwable {
                      String[] roles = restrictedAnnotation.allowedRoles();
                      System.out.println("Allowed:" +  roles);
           }
    

    이것은 주석을 메소드 서명 인 restrictedAnnotation의 매개 변수에 바인딩합니다. 필자가 잘 모르는 부분은 주석 유형을 얻는 방법이며 매개 변수를 기반으로하는 것 같습니다. 그리고 일단 주석을 얻으면 값을 얻을 수 있습니다.

  4. ==============================

    4.Spring Security를 ​​사용하는 것이 어떨까요? 구현 및 사용법은 간단합니다. 휠 재발견에 시간을 낭비하지 않습니다.

    Spring Security를 ​​사용하는 것이 어떨까요? 구현 및 사용법은 간단합니다. 휠 재발견에 시간을 낭비하지 않습니다.

  5. ==============================

    5.Whith Spring AOP MyManagerImpl이 MyManager를 구현하는 것과 같은 상황이라면 pointcut이 인터페이스 메소드에 적용되므로 MethodSignature는 주석이없는 MyManager에 정의 된 메소드를 설명합니다. 이 문제를 해결할 수있는 유일한 방법은 jp.getTarget () 객체의 클래스를 검사하고 해당 메서드를 검색하는 것입니다.

    Whith Spring AOP MyManagerImpl이 MyManager를 구현하는 것과 같은 상황이라면 pointcut이 인터페이스 메소드에 적용되므로 MethodSignature는 주석이없는 MyManager에 정의 된 메소드를 설명합니다. 이 문제를 해결할 수있는 유일한 방법은 jp.getTarget () 객체의 클래스를 검사하고 해당 메서드를 검색하는 것입니다.

  6. from https://stackoverflow.com/questions/2559255/spring-aop-how-to-get-the-annotations-of-the-adviced-method by cc-by-sa and MIT license