java - 无法在 Axis2 客户端项目中加载 Rampart 模块

标签 java web-services axis2 ws-security rampart

虽然我的项目是一个 Java 网络应用程序,但我仅将网络服务用作客户端。

我使用 Apache Axis2 成功创建了 stub ,并使用 SoapUI 测试了它们。现在是实现安全性的时候了。 This is我必须整合的服务之一。它附带一个 WS-Security 策略,因此我必须正确传输我的凭据。

我想将 Apache Rampart 集成到我的项目中。我发现下载所需的 JAR 和 MAR 文件有很多困难,但我做到了。

现在我有以下项目结构:

webapp
   -- WEB-INF
       -- classes
       -- conf
          -- axis2.xml
       -- modules
          -- several -mar files
          -- rampart-1.6.2.mar
          -- modules.list
       -- spring
          -- various context files
       -- web.xml

我使用 Spring 来初始化所有 bean,包括 Web 服务 stub 。如果我让 Spring 正常实例化它们,它们将按预期工作。但是当我使用 BeanPostProcessor接合 rampart 模块将失败

Caused by: org.apache.axis2.AxisFault: Unable to engage module : rampart
at org.apache.axis2.client.ServiceClient.engageModule(ServiceClient.java:363)
at it.csttech.edwin.security.SecurityHandler.engage(SecurityHandler.java:52)

在我的 axis2.xml 中,我添加了 <module ref="rampart" />addressing 之后

我使用以下代码启用 Rampart:

    RampartConfig rc = new RampartConfig();
    rc.setUser(user);
    Policy policy = PolicyEngine.getPolicy(new StAXOMBuilder(policyStream).getDocumentElement()); //XML policy file in classpath
    policy.addAssertion(rc);
    serviceClient.engageModule("rampart"); //this fails
    Options options = serviceClient.getOptions();
    options.setProperty(WSHandlerConstants.PW_CALLBACK_REF, callbackHandler); //This will provide password
    options.setProperty(RampartMessageData.KEY_RAMPART_POLICY, policy); //This will provide policy

我发现如果我这样做 Map<String, AxisModule> modules = serviceClient.getAxisConfiguration().getModules();我刚得到一张空 map !!!!!!

所以根本没有加载任何模块。

然后我尝试将 modules/目录移动到我硬盘上的另一个位置,并通过系统属性 axis2.repo 链接它但即使 Axis2 不会加载,如果我故意设置错误的路径,它也不会加载 rampart-1.6.2.mar文件和 map 仍然是空的。

我快疯了。我不知道如何将 Rampart 正确加载到我的设置中。我什至不知道 Spring IoC 是否可用于注入(inject)正确的配置和/或让 Rampart 参与所有服务。

最佳答案

您可以尝试创建 ConfigurationContext 并使用它获取 ServiceClient。

// create configuration context
ConfigurationContext ctx = ConfigurationContextFactory.createConfigurationContextFromFileSystem(RESOURCES_DIR, null);

// create service client
ServiceClient serClient = new ServiceClient(ctx, null);

// engage modules
serClient.engageModule("rampart");

“RESOURCES_DIR”应指向您的 .mar 文件的位置。

关于java - 无法在 Axis2 客户端项目中加载 Rampart 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22359274/

相关文章:

java - 运行时动态绑定(bind)和类继承的区别

java - java中正则表达式的神奇日期

java - 消除算法中的噪声

asp.net - INSTEAD OF INSERT 触发器导致 Entity Framework 的 SaveChanges 中出现错误

java - 从部署在 glassfish 服务器中的应用程序调用 Web 服务时出现 ArrayIndexOutOfBoundsException

Java 的 AtomicLong 实现循环

java - { "readyState": 0 ,"status": 0 ,"statusText": "NetworkError: Failed to execute ' send' on 'XMLHttpRequest' : Failed to load 'http://localhost:8088/' .“}

web-services - 执行时间长的REST请求的方法?

java - 如何强制 Axis2 使用 HTTP 1.0 进行 Web 服务调用?

java - Axis2 Web 服务客户端生成 - 无需修改客户端的类型