【问题标题】:UnsupportedOperationException getUserPrincipalUnsupportedOperationException getUserPrincipal
【发布时间】:2013-11-20 19:21:55
【问题描述】:

我创建了一个 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 传输到 容器请求过滤器。 org.glassfish.grizzly.http.server.Request 具有安全性 信息(在本例中为 SSL 客户端证书信息),而 com.sun.jersey.spi.container.ContainerRequest 最初不提供。

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

我正在使用 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 合作组装此信息的方式与主体设置安全上下文?

【问题讨论】:

    标签: java authentication jersey grizzly


    【解决方案1】:

    Jersey/JAX-RS 要求在您检索有关主体、用户角色等的任何信息之前设置 SecurityContext。通常,在 Jersey,这是由专用的 ContainerRequestFilter 完成的。看看我们的一个示例中的示例过滤器:SecurityFilter

    在此之后,您可以将SecurityContext(使用@Context)注入您的资源或过滤器等其他提供程序。然后,您也可以拨打containerRequest.getUserPrincipal() 而不会收到UnsupportedOperationException

    编辑 1

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

    @Context
    private ThreadLocal<Request> request;
    

    【讨论】:

    • 感谢您的回复-我已将问题修改为更清楚。如果我只能获取 ContainerRequestFilter 已经可用的 Principal 信息,我会很乐意设置 SecurityContext
    • 我现在通过创建一个 PrincipalCache 解决了这个问题 - HttpUnitServerProbe 通过它的名称将 Principal 添加到缓存中,并向请求添加一个标头信息。这样,ContainerRequestFilter 可以使用修改后的请求标头中的信息从缓存中获取 Principal。鉴于您提到的示例,当缓存中没有主体信息时,BasicAuth 也是可能的。
    猜你喜欢
    • 2015-04-01
    • 2021-03-07
    • 2015-12-27
    • 2011-08-10
    • 2013-02-26
    • 2018-09-19
    • 2019-12-20
    • 1970-01-01
    相关资源
    最近更新 更多