在JAVA中根据方法和类访问自定义注释字段。

问题描述 投票:0回答:1

我必须根据允许访问的作用域来授权请求。我有一个基于令牌的授权,它给我返回请求允许的作用域。如果其中一个作用域与我的API允许的作用域相匹配,那么我就允许它访问API的内容。因此,我创建了一个自定义注释

 @Target(ElementType.METHOD)
 @Retention(RetentionPolicy.RUNTIME)
 public @interface Authorize{
 String[] scopes() default {""};
}

所以,在每个API中,我只需要在方法上面加上注解,并与令牌授权返回的作用域进行匹配。

我的控制器1

@PostMapping("/insert")
@Authorize(scopes = {"read", "write"})
public HttpStatus create(){
 // insertion code
}

@GetMapping("/students")
@Authorize(scopes = {"foo", "bar"})
public List<Student> get(){
// Get Code
}

我的控制器2

@PostMapping("/insert")
@Authorize(scopes = {"read", "write"})
public HttpStatus create(){
 // insertion code
}

@GetMapping("/classes")
@Authorize(scopes = {"foo", "bar"})
public List<Class> get(){
// Get Code
}

我试图访问作用域并进行匹配的代码。

private void validateScope(String[] scopes){
// Here 'scopes' is a string list which token authorization returned.
  Method[] methods = GenericController.class.getMethods();
  for(Method m: methods){
    if(m.isAnnotationPresent(Authorize.class)){
       Authorize auth = m.getAnnotation(Authorize.class)
       for(String t: auth.scopes())
         System.out.println(t);
    }
  }
  // once I parse the corresponding scopes allowed by the API properly, then here I will match it with 'scopes' 
}

这只是打印出所有应用于该类的作用域。而且,我还必须指定一个特定的控制器。我想让它通用

我怎样才能实现这一点呢?我想把调用做成通用的,这样我就可以调用任何控制器,也可以从特定的方法中获得作用域,而不是所有的方法。我在想Google Reflection可能会有帮助,但我不明白如何在我的用例中使用它。

我已经尝试过操作所有的 是否可以在java中读取注解的值? 但都不行。任何线索将被感激。先谢谢你

java model-view-controller annotations
1个回答
1
投票

在我看来,授权是您的API的一个交叉问题。你的需求是使用 aspects 的完美候选。我已经使用了 Spring 方面来展示如何做到这一点。这不是一个工作代码,但给出了大致的想法。

  /**
  * Proxies a controller annotated with {@link Authorise} and checks if the requested scope
  * is in the list of allowed scopes.
  * @param pjp of type sometype
  * @throws {@link AuthorisationBusinessException} is the requested scope is not allowed.
  */
  @Around("@annotation("pathToAnnotation")")
  public Object authorisationAdvice(ProceedingJoinPoint pjp)
      throws Throwable {

    MethodSignature signature = (MethodSignature) pjp.getSignature();

    Authorize annotation = signature.getMethod().getAnnotation(Authorize.class);
    List<String> allowedScopes = annotation.scopes();

    Object arg = pjp.getArgs()[0];    //this will be the argument to your controller. Cast to to the appropriate type and get the requested scope from the token.

    // get the requested scope

   if(annotation.scopes().contains(requestedScope)) {
       return pjp.proceed(); 
   } else {
      //throw exception
   }
}

这个建议的基本作用是拦截任何注解为: @Authorise. 一旦方法被代理,你就有了允许的作用域集,以及你被请求的作用域。现在你可以添加任何你想要的检查。

你可以继续阅读 Spring 这里的Aspects.Spring.iospringdocs2.5.xreferenceaop.html。https:/docs.spring.iospringdocs2.5.xreferenceaop.html。

© www.soinside.com 2019 - 2024. All rights reserved.