ContainerRequestfilter

ContainerRequestfilter

我创建了一个ContainerRequestfilter并成功触发了它。
现在,我想像以前这样在繁琐的HttpServerProbe中访问之前设置的UserPrincipal:

import com.sun.jersey.spi.container.ContainerRequest;

@Override
public ContainerRequest filter(ContainerRequest request) {
  Principal principal=req.getUserPrincipal();
}


而是抛出“ UnsupportedOperationException”。看来ContainerRequest没有从修改后的请求中提取UserPrincipal。

修改是通过

import org.glassfish.grizzly.http.server.Request;

...

public void onRequestReceiveEvent(
  HttpServerFilter filter,Connection connection, Request request) {
  Principal principal=getPrincipalFromRequest(request);
  request.setUserPrincipal(principal);
}


问题是如何将Principal信息从HttpServerProbe传输到
ContainerRequestFilter。 org.glassfish.grizzly.http.server.Request具有安全性
信息(在本例中为SSL客户端证书信息),而com.sun.jersey.spi.container.ContainerRequest最初不提供该信息。

不幸的是,我还没有找到一种在HttpServerProbe中设置SecurityContext的方法。在
ContainerRequestFilter我可以做到,但是如我期望的那样,必要的Principal信息不可用。

我正在使用泽西岛1.17和灰熊2.3.5

以下链接均与该问题有些相关,但没有一个线索
出现上述错误的原因可能是什么:

http://www.solutionoferror.com/java/use-containerrequestfilter-in-jersey-without-web-xml-79849.asp

Jersey ContainerRequestFilter not triggered

http://subversion.jfrog.org/artifactory/public/tags/2.1.0/rest/src/main/java/org/artifactory/rest/common/RestAuthenticationFilter.java

http://sites.gbif.org/common-resources/gbif-common-ws/xref/org/gbif/ws/server/filter/AuthFilter.html

http://2rdscreenretargeting.blogspot.de/2012/06/secure-jersey-with-oauth2.html

要访问主体/以主体方式设置安全性上下文,HttpServerProbe和ContainerRequestFilter协作以组装此信息,需要做什么?

最佳答案

Jersey / JAX-RS要求先设置SecurityContext,然后才能检索有关主体,用户角色等的任何信息。通常,在Jersey中,这是由专用的ContainerRequestFilter完成的。看一下我们的一个样本中的样本过滤器:SecurityFilter

之后,您可以将SecurityContext(使用@Context)注入到资源或其他提供程序(例如过滤器)中。然后,您也可以在不获取containerRequest.getUserPrincipal()的情况下呼叫UnsupportedOperationException

编辑1

如果需要获取灰熊级别的Principal对象,可以将当前Request注入到过滤器中,然后在filter方法中检索值。

@Context
private ThreadLocal<Request> request;

09-30 22:16