我想在使用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
作为起点,我已经能够知道哪个方法会被调用。但是,我仍然没有想出如何确定哪些参数实际上将用于调用该方法。
在我的头顶,我能想到的两项工作变通的:
- 使用吉斯+新泽西一种方法拦截器。
- 在
QueryStringCustomerInjectable
中对此逻辑进行编码,但这看起来有点草率。这将是一门课太多。
然而,我真的喜欢做到这一点只用针织/ JAX-RS。我觉得我很亲密!
想法?指针?
谢谢!
我还没有找到一种无忧无虑的方式来做到这一点...所以它要么使用guice,要么使用cxf,它提供了拦截器和一种方法来提供你自己的invokers。 – chahuistle 2011-06-16 20:47:38
您是否看过AOP或仅使用Servlet过滤器来解决方法1? – hisdrewness 2013-11-20 17:56:41
您是否尝试过使用ContainerRequestFilter并注入客户?我不确定是否@ BeanParam被限制在资源中,或者它们也可以被注入到过滤器中,但假设过滤器不是preMatch,它应该可以工作。 – 2014-03-27 05:58:09