UnsupportedOperationException getUserPrincipal

时间:2013-11-20 19:21:56

标签: java authentication jersey grizzly

我创建了一个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我可以做到,但必要的主要信息不可用,如我所料。

我正在使用Jersey 1.17和Grizzly 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合作收集此信息的方式中,需要做什么才能访问主体/设置主体的安全上下文?

1 个答案:

答案 0 :(得分:2)

泽西岛/ JAX-RS期望在您可以检索有关委托人,用户角色等的任何信息之前设置SecurityContext。通常,在泽西岛,这是由专用ContainerRequestFilter完成的。从我们的一个样本中查看样本过滤器:SecurityFilter

在此之后,您可以将SecurityContext(使用@Context)注入资源或其他提供程序(如过滤器)。然后,您也可以在没有containerRequest.getUserPrincipal()的情况下致电UnsupportedOperationException

编辑1

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

@Context
private ThreadLocal<Request> request;