2011-06-10 92 views
19

我想在使用Jersey的REST服务中实现自定义授权。此自定义授权检查方法的注释以及方法接收的实际参数。在Jersey中获取实际参数值ResourceFilterFactory

我的JAX-RS注解的方法是这样的:

@GET 
@Path("customers") 
@Requires(Role.CustomerManager) 
public Customer getCustomer(@ParseFromQueryString @CheckPermission final Customer customer) { 
    // ... 
} 

@ParseFromQueryString是一个注释,指示州(通过注射提供者)从查询字符串解组一个Customer。该代码如下所示:

public class QueryStringCustomerInjectable implements Injectable<Customer> { 
    public Customer getValue() { 
    final Customer customer = new Customer(); 
    // ... a UriInfo was injected using the @Context annotation 
    // ... extract parameters from QueryString and use setters 
    return customer; 
    } 
} 

@CheckPermission注释指示我的自定义authoriser该权限是对客户进行检查。一些用户可以访问某些客户的信息。类似地,注释需要调用者应该具有的角色。这些不是Java的安全角色(字符串),相反,它们是枚举值。

使用Jersey的ResourceDebuggingFilter作为起点,我已经能够知道哪个方法会被调用。但是,我仍然没有想出如何确定哪些参数实际上将用于调用该方法。

在我的头顶,我能想到的两项工作变通的:

  1. 使用吉斯+新泽西一种方法拦截器。
  2. QueryStringCustomerInjectable中对此逻辑进行编码,但这看起来有点草率。这将是一门课太多

然而,我真的喜欢做到这一点只用针织/ JAX-RS。我觉得我很亲密!

想法?指针?

谢谢!

+0

我还没有找到一种无忧无虑的方式来做到这一点...所以它要么使用guice,要么使用cxf,它提供了拦截器和一种方法来提供你自己的invokers。 – chahuistle 2011-06-16 20:47:38

+0

您是否看过AOP或仅使用Servlet过滤器来解决方法1? – hisdrewness 2013-11-20 17:56:41

+0

您是否尝试过使用ContainerRequestFilter并注入客户?我不确定是否@ BeanParam被限制在资源中,或者它们也可以被注入到过滤器中,但假设过滤器不是preMatch,它应该可以工作。 – 2014-03-27 05:58:09

回答

0

对于客户反序列化,您可以实现javax.ws.rs.ext.ParamConverterProvider并将其注册到Jersey中。然后你可以用@QueryParam(“customer”)将它注入到你的方法中。它更灵活一点,因为您也可以将它用于@BeanParam或@PathParam注释。

然后你可以使用ContainerRequestFilter。请参阅参考文献,了解Oauth1如何穿上球衣,例如OAuth1ServerFilter。 您可以做的下一件事是创建一个功能,它将注册新创建的过滤器(请参阅Oauth1ServerFeature以供参考 - 我现在无法找到源代码)。

祝你好运!

0

为什么不使用自己的Servlet过滤器例如

public class YourFilter implements Filter { 
    ... 
    @Override 
public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain filterChain) throws IOException, ServletException { 

    // HttpServletRequest httpReq = (HttpServletRequest) request; 
    // HttpServletResponse httpResp = (HttpServletResponse) response; 

    // HttpServletRequest httpReq = (HttpServletRequest) request; 
    // HttpServletResponse httpResp = (HttpServletResponse) response; 
    // ..... httpReq.getUserPrincipal(); 


    // then set what you need using ThreadLocal and use it inside your resource class 

    // do not forget to call 
    filterChain.doFilter(request, response); // at the end of this method 

} 

最后一步是注册您的servlet过滤器。这是通过使用web应用程序的web.xml来完成的

它会在调用球衣资源中的实际代码之前拦截HTTP请求。