【问题标题】:What does the @Secure annotation do and what package is it apart of@Secure 注释有什么作用,它是什么包
【发布时间】:2013-08-23 01:50:18
【问题描述】:

我正在使用 Java EE、JAX-RS、Jersey 编写 API。为此,我实现了自己的安全上下文和安全过滤器。

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

【问题讨论】:

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


    【解决方案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)并确保该文件在类中-您的应用程序的路径。

    【讨论】:

    • 谢谢,有道理,我试试
    猜你喜欢
    • 2010-10-02
    • 2011-01-07
    • 2011-01-14
    • 2019-04-26
    • 2016-04-29
    • 2017-03-02
    • 2012-10-04
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多