WS-Security无法使用CXF - 端点地址

时间:2011-10-23 05:49:12

标签: security cxf

我正在尝试在使用apache cxf 2.2.12版编写的Web服务中添加基于UsernameToken的安全性。

一旦我在weblogic中部署我的应用程序,我就会得到两个URL,我可以从中访问我的WSDL。

  1. http://localhst:8080/myapp/services/MyService?wsdl
  2. http://localhost:8080/myapp/MyService?wsdl
  3. 我正在尝试使用soapUI客户端使用webservice,问题是如果我使用第二个URL,一切正常,我的ejb正在正确注入等,但WSS4JInterceptor根本没有被调用。

    如果我更改了soapUI中的URL以使用第一个,那么Interceptor就会被调用,但是我的服务没有被注入,我得到NULL作为服务对象。

    我在spring配置文件中配置了WSS4JInterceptor。我需要在每个请求之前调用此Interceptor,以便我可以从请求标头验证用户令牌。

    这是我的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" />
    

    任何指针我做错了。

    注意:我的服务工作正常,没有回拨没有/ services /

    的URL

1 个答案:

答案 0 :(得分:0)

我的猜测是Web服务实际上已经部署了两次,一次是由您在beans.xml文件中配置的CXF,一次是由Weblogic作为Java EE 5 Web服务。 CXF不执行注入(我假设您使用的是@EJB),而Weblogic对您的WS-Security配置一无所知。