获取Jersey ResourceFilterFactory中的实际参数值

时间:2011-06-10 08:59:33

标签: java rest authorization jersey jax-rs

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

我的jax-rs注释方法如下:

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

@ParseFromQueryString是一个注释,表示Jersey(通过Injectable provider)从查询字符串中解组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注释表示我的自定义授权人要在客户上检查权限。有些用户可以访问某些客户的信息。类似地,@Requires注释扮演调用者应该具有的角色。这些不是java的安全角色(字符串),而是它们是枚举值。

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

在我的头脑中,我可以想到两个解决方法:

  1. 使用Guice + Jersey的方法拦截器。
  2. QueryStringCustomerInjectable中对此逻辑进行编码,但这看起来有点草率。这将是一个做太多的课程。
  3. 然而,我真的喜欢只使用Jersey / JAX-RS来做这件事。我觉得我太近了!

    想法?指针?

    谢谢!

2 个答案:

答案 0 :(得分:0)

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

然后您可以使用ContainerRequestFilter。作为参考,参考Oauth1的运动衫如何OAuth1ServerFilter。 接下来你要做的就是创建一个可以注册新创建的过滤器的功能(参见Oauth1ServerFeature作为参考 - 我现在找不到源代码)。

祝你好运!

答案 1 :(得分: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 app的web.xml

完成的

在调用jersey资源中的实际代码之前,它将拦截您的HTTP请求。