我可以向JAX-RS方法添加自定义注释以验证访问权限吗?

时间:2015-08-26 13:34:36

标签: java annotations jax-rs

例如,我有以下方法:

@GET
    @Path("/get/current")
    public Response getCurrentInfo(@HeaderParam("Authorization") String token){

        Gson gson = new GsonBuilder()
        .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS")
        .setPrettyPrinting().create();          

        String email = SecurityProvider.decryptTokenAndGetEmail(token);

        if(DB.isAccessPermitted(email)){
            Info info = DB.getCurrentInfo();
            String json = gson.toJson(info);
            return Response.ok(json).build();
        }else{
           return Response.status(401).build();
        }

    }

所以要写入每个方法:

          if(DB.isAccessPermitted(email)){
                Info info = DB.getCurrentInfo();
                String json = gson.toJson(info);
                return Response.ok(json).build();
            }else{
               return Response.status(401).build();
            }

我将创建例如@SecurityCheck注释,注释每个具有有限访问权限的方法,并仅在一个地方执行检查。是否可以通过注释实现并且可以提供MVCE? 谢谢。

1 个答案:

答案 0 :(得分:8)

如果您使用的是JAX-RS 2.0,则可以将ResourceInfo注入ContainerRequestFilter,然后从java.lang.reflect.Method获取Method。从@Provider @Priority(Priorities.AUTHENTICATION) public class SecurityFilter implements ContainerRequestFilter { @Context private ResourceInfo resourceInfo; // You can get the header from the `requestContext` @Override public void filter(ContainerRequestContext requestContext) { Method resourceMethod = resourceInfo.getResourceMethod(); SecurityCheck annotation = resourceMethod.getAnnotation(SecurityCheck.class); // get some value from annotation if (notAllowedAccess) { throw new WebApplicationException(403); } } } ,您可以获得注释。例如

ResourceInfo

只有当你需要从注释中获取一些值时才需要这个(@SecurityCheck("SomeRoleAllowed")),例如DynamicFeature

如果您不需要该值,并且您想要的任何方法都是针对任何注释要过滤的方法,那么您可以创建@Provider public class SecurityCheckDynamicFeature implements DynamicFeature { @Override public void configure(ResourceInfo info, FeatureContext context) { Method method = info.getResourceMethod(); SecurityCheck annotation = method.getAnnotation(SecurityCheck.class); if (annotation != null) { context.register(SecurityFilter.class); } } } ,将每个方法绑定到过滤器。例如

@NameBinding

或者另一种方法是在自定义注释上使用@NameBinding @Target(...) @Retention public @interface SecurityCheck {}

SecurityFilter

然后,您还需要使用注释注释{{1}}类。注释的任何方法或类都将通过过滤器。

其他资源: