如何在Web服务请求之间发送用户名?

时间:2009-05-21 08:02:53

标签: java web-services oc4j

基本上问题是:
有一个存储的数据库过程,它将用户名作为参数,并根据它生成一些XML数据。它由一个在不安全的Web服务中没有参数的方法调用(让我们称之为Web服务WSA)。还有另一个Web服务(我们称之为WSB)应该调用WSA。在此设置中,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。但是,如果我调用WSB(后者调用WSA),则Principalnull。如果我保护WSA并直接调用它,Pricipal不是null并且包含用户(但它不能解决问题,因为我需要调用WSB,而不是WSA)。

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

  3. 尝试使用WebServiceContext注释注入@Resource的实例,但显然OC4J不支持此操作。

  4. 如果有人能说明我可能做错了什么,我会非常感激。

1 个答案:

答案 0 :(得分:1)

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

最简单的修复可能是更改WSA API以接受请求参数中的用户ID。

HTH 汤姆