@Secure注释做什么以及它包含哪些包

时间:2013-08-20 20:51:39

标签: jersey jax-rs java-ee-6 security-context

我正在使用Java EE,JAX-RS,Jersey编写API。在这样做的过程中,我实现了自己的安全上下文和安全过滤器。

看看像这样的问题(How to get MIME type of uploaded file in Jersey)我看过@Secure注释,但是它做了什么?我希望这是一个注释,它以与@RolesAllowed检查用户是否有权访问特定方法相同的方式查询安全上下文的isSecure方法。如果有这样的方式这样做的注释或我坚持使用@Context来获取安全上下文,只是从那。

1 个答案:

答案 0 :(得分:1)

@Secure注释似乎是一个自定义注释。 JAX-RS / Jersey不支持这种开箱即用的功能,但它并不难实现。假设您有自己的@Secure注释,并且您希望检查通信通道对于使用此注释注释的方法是否安全。您需要创建一个自定义ResourceFilterFactory,您可以在其中为此类方法指定特殊过滤器:

public class IsSecureResourceFilterFactory implements ResourceFilterFactory {

    private class IsSecureFilter implements ResourceFilter, ContainerRequestFilter {

        // ResourceFilter

        @Override
        public ContainerRequestFilter getRequestFilter() {
            return this;
        }

        @Override
        public ContainerResponseFilter getResponseFilter() {
            return null;
        }

        // ContainerRequestFilter

        @Override
        public ContainerRequest filter(final ContainerRequest request) {
            // Check whether the channel is secure.
            if (request.isSecure()) {
                return request;
            }

            // Throw an exception if it's not.
            throw new WebApplicationException(Response.Status.FORBIDDEN);
        }
    }

    @Override
    public List<ResourceFilter> create(final AbstractMethod abstractMethod) {
        // Add IsSecureFilter for resource methods annotated with @Secure annotation (ignore other resource methods).
        return abstractMethod.isAnnotationPresent(Secure.class)
                ? Collections.<ResourceFilter>singletonList(new IsSecureFilter()): null;
    }
}

现在你需要告诉泽西这个ResourceFilterFactory。有两种方式:

  • 通过web.xml

    <init-param>
        <param-name>com.sun.jersey.spi.container.ResourceFilters</param-name>
        <param-value>my.package.IsSecureResourceFilterFactory</param-value>
    </init-param>
    
  • 或通过META-INF/services机制 - 您需要创建一个名为META-INF/services/com.sun.jersey.spi.container.ResourceFilterFactory的文件,其中包含工厂的完全限定名称(在本例中为my.package.IsSecureResourceFilterFactory)并确保此文件位于应用程序的类路径中。