Java 不支持操作异常getUserPrincipal
我已经创建了一个ContainerRequestfilter并成功地将其触发。 现在,我想在grizzly HttpServerProbe中访问我之前设置的UserPrincipal,如下所示:Java 不支持操作异常getUserPrincipal,java,authentication,jersey,grizzly,Java,Authentication,Jersey,Grizzly,我已经创建了一个ContainerRequestfilter并成功地将其触发。 现在,我想在grizzly HttpServerProbe中访问我之前设置的UserPrincipal,如下所示: import com.sun.jersey.spi.container.ContainerRequest; @Override public ContainerRequest filter(ContainerRequest request) { Principal principal=req.ge
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);
}
问题是如何将主体信息从HttpServerProbe传输到
ContainerRequestFilter。org.glassfish.grizzly.http.server.Request具有安全性
信息(在本例中为SSL客户端证书信息),而com.sun.jersey.spi.container.ContainerRequest最初不提供该信息
不幸的是,我还没有找到在HttpServerProbe中设置SecurityContext的方法。在里面
ContainerRequestFilter我可以这样做,但必要的主要信息并不像我预期的那样可用
我使用的是泽西1.17和灰熊2.3.5
下面的链接都与这个问题有关,但没有一个提供线索
上述错误的原因可能是什么:
需要做什么才能访问主体/设置主体的安全上下文,以使HttpServerProbe和ContainerRequestFilter能够合作组装此信息?Jersey/JAX-RS希望在您检索有关主体、用户角色等的任何信息之前进行设置。通常,在Jersey,这是由专门的人员完成的。请查看我们其中一个示例中的示例过滤器:
在此之后,您可以将SecurityContext
(使用@Context
)注入到您的资源或其他提供者(如过滤器)中。然后,您还可以调用containerRequest.getUserPrincipal()
,而无需获得UnsupportedOperationException
编辑1
如果需要在grizzly级别获取主体
对象,可以将当前请求
注入过滤器,然后在过滤器
方法中检索值
@Context
private ThreadLocal<Request> request;
@Context
本地请求;
谢谢您的回复-我已经修改了问题以使其更清楚。如果我只能获取容器中已有的主体信息RequestFilteri现在通过创建一个PrincipalCache解决了这个问题,那么我很乐意设置SecurityContext—HttpUnitServerProbe会将主体按名称添加到缓存中,并将头信息添加到请求中。这样,ContainerRequestFilter就可以使用修改后的请求头中的信息从缓存中提取主体。在您提到的示例中,当缓存中没有主体信息时,也可以使用BasicAuth。