基本上问题是:
有一个存储的数据库过程,它将用户名作为参数,并根据它生成一些XML数据。它由一个在不安全的Web服务中没有参数的方法调用(让我们称之为Web服务WSA)。还有另一个Web服务(我们称之为WSB)应该调用WSA。在此设置中,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),则Principal
为null
。如果我保护WSA并直接调用它,Pricipal
不是null并且包含用户(但它不能解决问题,因为我需要调用WSB,而不是WSA)。
为两个服务创建处理程序(扩展javax.xml.rpc.handler.GenericHandler
),这些服务应该能够处理消息。有一件事让我感到困惑。正确调用处理程序方法 - WSB处理程序处理请求,然后WSA处理程序处理请求,然后WSA处理程序处理响应,最后WSB处理程序处理响应。但是当我尝试在每一步上将消息打印到文件时,我发现即使在第一步(当WSB处理请求时),消息中也没有安全信息。没有用户名,没有什么。事实上,在调用服务之前预览请求消息时,该消息与调用页面上显示的消息完全不同。
尝试使用WebServiceContext
注释注入@Resource
的实例,但显然OC4J不支持此操作。
如果有人能说明我可能做错了什么,我会非常感激。
答案 0 :(得分:1)
问题是“WSA是由一个在不安全的Web服务中没有参数的方法调用的”。因此,WSA没有安全上下文从...中获取用户ID
最简单的修复可能是更改WSA API以接受请求参数中的用户ID。
HTH 汤姆