在泽西岛资源筛选器工厂中获取实际参数值

2022-09-02 14:12:42

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

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

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

是一个注释,指示 Jersey(通过可注入提供程序)从查询字符串中取消编组 。其代码如下所示:@ParseFromQueryStringCustomer

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;
  }
}

注释指示我的自定义授权者要检查客户的权限。某些用户可以访问某些客户的信息。同样,注释具有调用程序应具有的角色。这些不是java的安全角色(字符串),而是枚举值。@CheckPermission@Requires

使用泽西岛作为起点,我已经能够知道将调用哪种方法。但是,我仍然没有弄清楚如何确定哪些参数将实际用于调用该方法。ResourceDebuggingFilter

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

  1. 使用 Guice + Jersey 的方法拦截器。
  2. 在 中编写此逻辑,但这似乎有点草率。这将是一个做太多事情的课程。QueryStringCustomerInjectable

然而,我真的想只使用泽西岛/ JAX-RS来做到这一点。我觉得我离得很近!

想法?指针?

谢谢!


答案 1

您应该使用 或 来处理有关方法的所有信息。请参阅泽西岛过滤器和拦截器FiltersInterceptors


答案 2

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

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

祝你好运!