1

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

  1. 有了 WSA 工具javax.xml.rpc.server.ServiceLifecycle。这为 WSA 提供了一个 的实例javax.xml.rpc.server.ServletEndpointContext,它为我提供了一个java.security.Principal. 但是,Principal如果null我调用 WSB(后者又调用 WSA)。如果我保护 WSA 并直接调用它,Pricipal则不是 null 并且包含用户(但它不能解决问题,因为我需要调用 WSB,而不是 WSA)。

  2. 为这两个服务创建了处理程序(扩展javax.xml.rpc.handler.GenericHandler),它们应该能够处理消息。有一件事让我很困惑。处理程序方法被正确调用 - WSB 处理程序处理请求,然后 WSA 处理程序处理请求,然后 WSA 处理程序处理响应,最后 WSB 处理程序处理响应。但是当我尝试在每一步将消息打印到文件时,我发现即使在第一步(当 WSB 处理请求时),消息中也没有安全信息。没有用户名,什么都没有。实际上,在调用服务之前预览请求消息时,该消息与调用页面上显示的消息完全不同。

  3. WebServiceContext尝试使用注释注入一个实例@Resource,但显然 OC4J 不支持这一点。

如果有人可以阐明我可能做错了什么,我将非常感激。

4

1 回答 1

1

问题是“WSA 是由不安全的 Web 服务中没有参数的方法调用的”。因此,WSA 没有安全上下文来从...中获取用户 ID。

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

HTH 汤姆

于 2009-05-21T15:11:57.490 回答