是否可以在处理请求之前使用自定义注解来过滤请求?

v1uwarro  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(359)

我的应用程序中有许多控制器,希望能够对控制器中的每个方法进行注解,以指示访问该请求所需的权限级别。
例如

@RestController
class MyController {

    @Permission("MyC_R")
    @RequestMapping(value = "/list", produces = "application/json" method = RequestMethod.GET)
    public ResponseEntity<String> list(final HttpServletRequest req) throws UnsupportedEncodingException {
        ... fluff omitted for brevity

        return new ResponseEntity(body, rh, hs);
    }
}

我们正在使用包含用户权限的jwt令牌。我们希望能够传递这个参数 MyC_R@Permission 注解-(意味着mycontroller/read),然后检查该用户在其jwt中是否具有权限。我已经有了一个类,可以提取并检查用户权限-我只需要在请求之前调用它,这样如果发生这种情况,我就可以将401 unauthorized头返回到前端。
我考虑过使用aop,但这似乎是更全面的控制器。我需要能够将此应用于每个方法/参数的特定/每个控制器。
注解会在之前得到处理吗?如果注解中的权限检查失败,是否可以在不进入方法的情况下向前端发送响应?

ztmd8pv5

ztmd8pv51#

你可以也应该使用aop。您完全可以将参数传递给注解以设置每个metod的权限级别。
定义接口如下:

@Retention(...)
@Target(ElementType.METHOD)
public @interface Permission {
   String permissionLevel();
}

然后定义您的实现

//This code gets executed before the controller code.
@Around("@annotation(...Permission)")
public Object authorizeRequest(ProceedingJoinPoint joinPoint) throws Throwable {

 try{
   MethodSignature methodSignature = (MethodSignature) jp.getSignature();
   Class<?> class = methodSignature.getDeclaringType();
   Method method = class.getDeclaredMethod(methodSignature.getName(),methodSignature.getParameterTypes());
   Permission yourCustomAnnotation = method.getAnnotation(Permission.class);
   String permissionLevel = yourCustomAnnotation.permissionLevel();

   //Do your filtering based on the parameter declared per controller

   if(user has permission) {
     // Execution continues to controller
     joinPoint.proceed();
   } else {
     //Return 401 to user

   }
 }catch(Exception exception) {
 }

}

相关问题