WS-Security не работает с CXF - адрес конечной точки - PullRequest
0 голосов
/ 23 октября 2011

Я пытаюсь добавить безопасность на основе UsernameToken в веб-сервисы, написанные с использованием apache cxf версии 2.2.12.

После развертывания приложения в weblogic я получаю два URL-адреса, с которых я могу получить доступ к своему WSDL.

  1. http://localhst:8080/myapp/services/MyService?wsdl
  2. http://localhost:8080/myapp/MyService?wsdl

Я пытаюсь использовать веб-сервис с использованием клиента soapUI, и проблема в том, что если я использую второй URL-адрес, все работает нормально, мой ejb правильно вводится и т. Д., Но WSS4JInterceptor вообще не вызывается.

Если я изменю URL-адрес в soapUI для использования 1-го, тогда вызывается Interceptor, но мои службы не вводятся, и я получаю NULL как объект службы.

Я настроил WSS4JInterceptor в моем файле конфигурации Spring. Мне нужно вызывать этот перехватчик перед каждым запросом, чтобы я мог проверить токен пользователя из заголовка запроса.

Вот мой боб.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 Ответ

0 голосов
/ 01 ноября 2011

Я предполагаю, что Web-сервис фактически развертывается дважды, один раз CXF, как настроено в вашем файле beans.xml, и один раз Weblogic как веб-сервис Java EE 5.CXF не выполняет инъекцию (я предполагаю, что вы используете @EJB), а Weblogic ничего не знает о вашей конфигурации WS-Security.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...