基本上问题是这样的:
有一个存储数据库过程,该过程将用户名作为参数,并根据用户名生成一些XML数据。它由不安全的Web服务中不带参数的方法调用(我们将该Web服务称为WSA)。还有另一个应该称为WSA的Web服务(简称为WSB)。在这种设置中,WSA只能由WSB调用,而不能由任何其他人调用。用户称为WSB,这是他们获取所需XML数据的方式。 Web服务已部署在OC4J上,并且已在其上启用了安全性。 WSB受OC4J保护,并通过提供OC4J用户的用户名和密码进行访问。
在测试Web服务时,OC4J为您提供了一个表格,您可以在其中调用调用Web服务之前输入登录信息。如果选择在标题中包括安全信息并在调用服务之前预览消息,则用户名和密码将出现在消息中。
我的问题是我无法获取安全信息(或至少是用户名)来到达端点实现和存储过程的调用。
到目前为止,我已经创建了WSA,制作了引用它的Web服务代理,并基于该代理创建了WSB。
到目前为止,我为获取用户名所做的尝试(以及为何不起作用):


WSA已实施javax.xml.rpc.server.ServiceLifecycle。这为WSA提供了javax.xml.rpc.server.ServletEndpointContext的实例,为我提供了java.security.Principal。但是,如果我呼叫WSB(又称为WSA),则该Principalnull。如果我保护WSA并直接调用它,则Pricipal不为null并包含用户(但它不能解决问题,因为我需要调用WSB而不是WSA)。
为两个服务创建了处理程序(扩展了javax.xml.rpc.handler.GenericHandler),这些处理程序应该能够处理该消息。一件事真的让我感到困惑。处理程序方法正确调用-WSB处理程序处理请求,然后WSA处理程序处理请求,然后WSA处理程序处理响应,最后WSB处理程序处理响应。但是,当我尝试在每个步骤上将消息打印到文件中时,我发现即使在第一步(当WSB处理请求)时,消息中也没有安全信息。没有用户名,什么都没有。实际上,该消息与在调用服务之前预览请求消息时在调用页面上显示的消息完全不同。
尝试通过使用WebServiceContext注释注入@Resource实例,但显然OC4J不支持此功能。


如果有人能阐明我可能在哪里做错了,我将非常感激。

最佳答案

问题是“在不安全的Web服务中,无参数的方法调用WSA”。因此,WSA没有安全上下文可以从中提取用户标识。

最简单的解决方法可能是更改WSA API以在请求参数中接受用户ID。

高温超导
汤姆

09-30 11:23