servlet过滤器是否知道REST请求的目标?

时间:2015-09-01 18:20:33

标签: java rest authentication filter

在javax servlet过滤器中,有没有办法知道请求的去向哪个servlet?

我有一些REST资源方法,用JAX-RS(@ Path,@ GET等)注释,并由RESTEasy扫描。

有一个servlet过滤器检查用户对每个请求的权限,但我想区分REST资源。 (他们应该要求不同的特权。)

此阶段是否知道绑定了REST请求的资源方法?或者它只在请求到达过滤器后面的servlet时才匹配?

谢谢!

3 个答案:

答案 0 :(得分:1)

如果您真的想拥有一些与授权相关的业务逻辑,则可以使用ContainerRequestFilter来实现此目的。您可以拥有如下内容:

public void filter(ContainerRequestContext crc) throws IOException {
        List<UriTemplate> matchedTemplates = uriInfo.getMatchedTemplates();
        String method = crc.getMethod().toLowerCase();
        String pathTemplate = "";
        String curTemplate = "";
        for (UriTemplate template : matchedTemplates) {
            String templateString = template.getTemplate();
            if (template.endsWithSlash()) {
                curTemplate = templateString.substring(0, templateString.length() - 1);
            }
            else {
                curTemplate = templateString;
            }
            pathTemplate = curTemplate + pathTemplate;
        }
   // Your authorization logic here once you have the pathTemplate.
   // pathTemplate (/v1/users/{userId}/cars/{carId}) and the HTTP method 
   // (GET, PUT..) together will determine the choice of servlet 
   // (resource) and the method within to be chosen and invoked.
}

您现在可以根据授权令牌(或用于识别用户身份的其他任何内容),方法调用(GET / PUT / POST / DELETE)和pathTemplate进行授权检查。如果你为所有资源正确设计了你的路径(pathTemplates)(换句话说,如果你有&#34;范围&#34;你的路径正确),一些正则表达式魔法,你应该没有问题匹配用户的授权特定网址范围。例如:带有令牌abc的userA只能访问/v1/users/abc/*路径,而带有令牌pqr的userB只能访问/v1/users/pqr/cars/*

不要忘记将其注册为泽西资源/过滤器。在dropwizard中,我们通常这样做:

environment.jersey().register(ApiRequestsFilter.class);

我希望这会有所帮助

答案 1 :(得分:0)

没有

唯一可用的信息是请求网址(路径)。

答案 2 :(得分:0)

您至少可以通过以下三种方式实现这一目标:

  1. 通过web.xml
  2. 通过访问过滤器中的SecurityContext
  3. 通过 注释javax.annotation.security
  4. 所有详情均可在此处找到:Jersey Security doc