#security #cxf
#Безопасность #cxf
Вопрос:
Я пытаюсь добавить безопасность на основе UsernameToken в веб-службы, написанные с использованием apache cxf версии 2.2.12.
Как только я разверну свое приложение в weblogic, я получаю два URL-адреса, с которых я могу получить доступ к своему WSDL.
Я пытаюсь использовать веб-сервис с помощью клиента SoapUI, и проблема в том, что если я использую 2-й URL, все работает нормально, мой ejb вводится правильно и т. Д., Но WSS4JInterceptor вообще не вызывается.
Если я изменю URL-адрес в SoapUI, чтобы использовать 1-й, тогда вызывается перехватчик, но затем мои службы не вводятся, и я получаю NULL в качестве объекта service.
Я настроил WSS4JInterceptor в моем файле конфигурации spring. Мне нужно вызывать этот перехватчик перед каждым запросом, чтобы я мог проверить токен пользователя из заголовка запроса.
Вот мой beans.xml
<bean id="wss4jInConfiguration" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<property name="properties">
<map>
<entry key="action" value="UsernameToken Timestamp"/>
<entry key="passwordType" value="PasswordText" />
<entry>
<key>
<value>passwordCallbackRef</value>
</key>
<ref bean="passwordCallback"/>
</entry>
</map>
</property>
</bean>
<bean id="passwordCallback" class="my.interceptors.callbacks.handlers.PasswordCallbackHandler"/>
<jaxws:endpoint id="myservice" implementor="my.sample.application.MyServiceImpl"
address="/MyService">
<jaxws:ininterceptors>
<ref bean="wss4jInConfiguration" />
</jaxws:ininterceptors>
</jaxws:endpoint>
Вот мой web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:WEB-INF/beans.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<display-name>CXF Servlet</display-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
В настоящее время у меня нет доступа к моему WSDL, но вот как выглядит тег.
<soap:address location="http://localhost:8080/MyServiceSoapPort" />
Любой указатель на то, что я делаю неправильно.
ПРИМЕЧАНИЕ: мои службы работают нормально без обратного вызова по URL без /services/
Ответ №1:
Я предполагаю, что веб-служба фактически развертывается дважды, один раз с помощью CXF, как настроено в вашем beans.xml файл и один раз с помощью Weblogic в качестве веб-службы Java EE 5. CXF не выполняет инъекцию (я предполагаю, что вы используете @EJB), и Weblogic ничего не знает о вашей конфигурации WS-Security.