我必须根据允许访问的作用域来授权请求。我有一个基于令牌的授权,它给我返回请求允许的作用域。如果其中一个作用域与我的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中读取注解的值? 但都不行。任何线索将被感激。先谢谢你
在我看来,授权是您的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。