我想使用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
作为起点,我已经能够知道将调用哪种方法。但是,我仍然没有想出如何确定实际用于调用该方法的参数。
在我的头脑中,我可以想到两个解决方法:
QueryStringCustomerInjectable
中对此逻辑进行编码,但这看起来有点草率。这将是一个做太多的课程。 然而,我真的喜欢只使用Jersey / JAX-RS来做这件事。我觉得我太近了!
想法?指针?
谢谢!
答案 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请求。