Jersey2 ContainerRequestFilter在执行身份验证之前未执行

时间:2016-03-10 11:18:07

标签: security jersey-2.0

我正在努力让安全性与我的jersey2网络应用程序一起使用。

我在ResourceConfig中注册了RolesAllowedDynamicFeature和我的请求过滤器以及AUTHENTICATION优先级

packages("example.jersey");
register(MyRequestFilter.class, Priorities.AUTHENTICATION);
register(RolesAllowedDynamicFeature.class);

我将@RolesAllowed添加到方法

@RolesAllowed("quinn")
@GET
@Path("/")
public Response getIt(@Context UriInfo uriInfo) {
    return Response.ok().entity(service.get()).build();
}

在我的请求过滤器中,我设置了安全上下文

SecurityContext securityContext = containerRequestContext.getSecurityContext();
containerRequestContext.setSecurityContext(new MySecurityContext("gary", securityContext));

当我从邮递员那里调用这个方法时,我得到一个403 - 禁止

我添加了日志记录到我的请求过滤器以查看它何时被调用。它没有被调用。

如果我从Web方法中删除@RolesAllowed,它会调用请求过滤器。

看来优先级.AUTHENTICATION没有任何区别。

我有什么遗失的吗?

1 个答案:

答案 0 :(得分:0)

您的过滤器是作为匹配后过滤器实现的。这意味着只有在选择了合适的资源方法来处理实际请求之后,即在发生请求匹配之后才应用过滤器。请求匹配是查找应根据请求路径和其他请求参数执行的资源方法的过程。

@RolesAllowed阻止选择特定的资源方法,为您提供“未执行”行为。

您有两种选择......使用@PreMatching as explained here

或者,按照类似问题的说明使用custom annotations