java - JAX-RS 2.0 通过@NameBinding 注释过滤参数

标签 java rest jersey jax-rs

我已经创建了一些 JAX-RS 2.0 资源(使用在 Servlet 容器中运行的 Jeresey 2.4)和一个过滤器来处理可以通过 @NameBinding 注释有选择地应用的身份验证和授权。这一切都很好。

我希望能够在此注释上定义一些参数(特别是访问每个方法/资源所需的安全权限),这些参数可在运行时供过滤器使用以改变此行为。

我注意到拦截器可以通过 javax.ws.rs.ext.InterceptorContext.getAnnotations() 执行此操作,但在 javax.ws.rs.container.ContainerRequestContext 中没有等效的过滤器。有什么想法可以实现吗?我希望能够执行以下操作:

@Target({TYPE, METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
@NameBinding
public @interface Secured {
    String[] requiredPermissions() default {};
}

@Secured
@Priority(Priorities.AUTHENTICATION)
public class SecurityRequestFilter implements ContainerRequestFilter {
    @Override
    public void filter(ContainerRequestContext containerRequestContext) throws IOException {
        // extract credentials, verify them and check that the user has required permissions, aborting if not
    }
}

@Path("/userConfiguration/")
public class UserConfigurationResource {
    @GET
    @Produces(MediaType.APPLICATION_XML)
    @Secured(requiredPermissions = {"configuration-permission"})
    public Response getConfig(@Context HttpServletRequest httpServletRequest) {
        // produce a response
    }
}

最佳答案

对于非供应商特定的解决方案,由于 JAX-RS 2.0,您可以使用 ResourceInfo :

@Secured
@Priority(Priorities.AUTHENTICATION)
public class SecurityRequestFilter implements ContainerRequestFilter {

    @Context
    private ResourceInfo resourceInfo;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {

        Method method = resourceInfo.getResourceMethod();

        if (method != null) {
            Secured secured = method.getAnnotation(Secured.class);
            ...
        }
    }
}

关于java - JAX-RS 2.0 通过@NameBinding 注释过滤参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19793828/

相关文章:

java - 如何在Ubuntu中打开终端并使用Java代码向其传递参数?

java - java中的数组和.substring

java - 轻松异常;向 ResteasyBootstrap 类的监听器实例发送上下文初始化事件的异常

java - 忽略 "Can not deserialize instance of java.util.LinkedHashMap out of START_ARRAY token"错误

java - Jersey : response with List<DBObject>

java - 添加 Jersey MOXy 导致 Jetty 运行失败

java - 使用已经唯一的整数生成哈希码

java - 仅来 self 的包的 Spring Boot 堆栈跟踪日志记录过滤器

rest - 在使用HATEOAS时找到 Restful 资源?

jakarta-ee - 为什么@PostConstruct 在@Singleton 上调用了两次