Хотя мой проект является веб-приложением Java, я использую веб-службы только как клиент.
Я успешно создал заглушки с Apache Axis2 и протестировал их с помощью SoapUI. Теперь пришло время реализовать безопасность. Это одна из услуг, которые я должен интегрировать. Он отправляет политику 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 для инициализации всех компонентов, включая заглушки веб-сервисов. Если я позволяю 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();
Я просто получаю пустую карту !!!!
Таким образом, модули не загружаются вообще.
Затем я попытался переместить каталог modules/directory в другое место на моем жестком диске и связать его с помощью системного свойства axis2.repo
но даже если Axis2 не будет загружаться, если я по умолчанию установил плохой путь, он просто не будет загружать rampart-1.6.2.mar
и карта будет по-прежнему пуста.
Я сошел с ума. Я не знаю, как правильно загрузить Rampart в мою настройку. Я даже не знаю, можно ли использовать Spring IoC для правильной настройки и/или использования 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.