Хотя мой проект представляет собой веб-приложение 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 для инициализации всех bean-компонентов, включая заглушки веб-сервисов. Если я позволю Spring создавать их экземпляры в обычном режиме, они будут работать так, как ожидалось. Но когда я использую BeanPostProcessor
, чтобы задействовать модуль вала, он не работает.
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/ в другое место на жестком диске и связать его через системное свойство axis2.repo
, но даже если Axis2 не загрузится, если я умышленно укажу неверный путь, он просто не загрузит файл rampart-1.6.2.mar
и карта будет по-прежнему пустой.
Я схожу с ума. Я не знаю, как правильно загрузить Rampart в мою установку. Я даже не знаю, можно ли использовать Spring IoC для внедрения правильной конфигурации и/или задействования Rampart во всех службах.