获取Jersey ResourceFilterFactory中的实际参数值

cha*_*tle 19 java rest authorization jax-rs jersey

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

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

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

@ParseFromQueryString是一个注释,指示Jersey(通过Injectable提供程序)Customer从查询字符串中解组a .代码如下:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

在我的头脑中,我可以想到两个工作:

  1. 使用Guice + Jersey的Method拦截器.
  2. 编码这个逻辑QueryStringCustomerInjectable,但这看起来有点草率.这会是一个做得太多的课.

然而,我真的想只使用Jersey/JAX-RS来做这件事.我觉得我太近了!

想法?指针?

谢谢!

Mir*_*cea 0

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

然后您可以使用ContainerRequestFilter。请参阅 jersey 如何执行 Oauth1 例如OAuth1ServerFilter。接下来您可以做的就是创建一个功能来注册新创建的过滤器(请参阅Oauth1ServerFeature以获取参考 - 我现在找不到源代码)。

祝你好运!