2012-01-27 16 views
6

मैंने वसंत के साथ अपाचे सीएक्सएफ सीखना शुरू कर दिया है। सबसे पहले, मैंने एक साधारण क्लाइंट/सर्वर मॉडल बनाया है: see hereअपाचे सीएक्सएफ + वसंत: सरल प्रमाणपत्र प्रमाणीकरण

अब मैं एक सरल प्रमाणपत्र प्रमाणीकरण का उपयोग करने की कोशिश कर रहा हूं। CXF-servlet.xml:

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:jaxws="http://cxf.apache.org/jaxws" 
xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> 

<jaxws:endpoint 
    id="helloWorld" 
    implementor="service.HelloWorldImpl" 
    address="/HelloWorld"> 

    <jaxws:features> 
     <bean class="org.apache.cxf.feature.LoggingFeature"/> 
    </jaxws:features> 
    <jaxws:inInterceptors> 
     <bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor"/> 
     <ref bean="WSS4JInInterceptor"/> 
    </jaxws:inInterceptors> 
</jaxws:endpoint> 

<bean id="WSS4JInInterceptor" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor"> 
    <constructor-arg> 
     <map> 
      <entry key="action" value="Signature"/> 
      <entry key="passwordCallbackRef"> 
       <ref bean="passwordCallback"/> 
      </entry> 
      <entry key="signaturePropFile" value="server_sign.properties"/> 
     </map> 
    </constructor-arg> 
</bean> 
<bean id="passwordCallback" class="service.PasswordCallbackHandler" /> 

server_sign.properties:

org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin 
org.apache.ws.security.crypto.merlin.keystore.type=jks 
org.apache.ws.security.crypto.merlin.keystore.password=keyStorePassword 
org.apache.ws.security.crypto.merlin.file=publicstore.jks 

तो यह है कि मैं विन्यास फाइल (सर्वर और ग्राहक के लिए) बदल दिया है cxf-client-servlet.xml:

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:jaxws="http://cxf.apache.org/jaxws" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
    http://cxf.apache.org/jaxws 
    http://cxf.apache.org/schema/jaxws.xsd"> 

<bean id="client" class="service.HelloWorld" factory-bean="clientFactory" factory-method="create"/> 

<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> 
    <property name="serviceClass" value="service.HelloWorld"/> 
    <property name="address" value="http://localhost:8080/services/HelloWorld"/> 
    <property name="outInterceptors"> 
     <list> 
      <bean class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor"/> 
      <ref bean="WSS4JOutInterceptor"/> 
     </list> 
    </property> 
</bean> 

<bean id="WSS4JOutInterceptor" class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor"> 
    <property name="properties"> 
     <map> 
      <entry key="action" value="Signature"/> 
      <entry key="user" value="ws-client" /> 
      <entry key="passwordCallbackRef"> 
       <ref bean="passwordCallback"/> 
      </entry> 
      <entry key="signaturePropFile" value="client_sign.properties"/> 
     </map> 
    </property> 
</bean> 

<bean id="passwordCallback" class="client.PasswordCallbackHandler" /> 

ग्राहक पूरी तरह से काम कर रहा है। यह इसका पासवर्डकॉलबैक हैंडलर का उपयोग करता है। समस्या यह है कि सर्वर अपने पासवर्डकॉलबैक हैंडलर का उपयोग नहीं कर रहा है। मैंने सर्वर को डीबग मोड में चलाया है, लेकिन यह इस कक्षा में नहीं जाता है। क्या कोई, कृपया, समझाओ, मैं गलत क्या कर सकता हूं?

अग्रिम धन्यवाद।

प्रगति:

  1. यदि आप एक उपयोगकर्ता है, जो प्रमाणपत्र सर्वर के कुंजीस्टोर में नहीं है, त्रुटि उठाया है ("उपयोगकर्ता WS-client1 के लिए कोई प्रमाण पत्र से एक अनुरोध प्रदान करने की कोशिश पाए गए हस्ताक्षर के लिए ")

  2. the resource से

    :" आप ऊपर jbossws-cxf.xml फ़ाइल में देख सकते हैं, एक कुंजी संग्रह पासवर्ड कॉलबैक हैंडलर भी कॉन्फ़िगर किया गया है, जबकि गुण फ़ाइल कीस्ट्रोक के लिए पासवर्ड है, इस कॉलबैक हैंडलर प्रत्येक कुंजी के लिए पासवर्ड सेट करने के लिए प्रयोग किया जाता है (इसे करना है दुकान में प्रत्येक कुंजी आयात होने पर इस्तेमाल किए गए मैच से मेल खाते हैं)। "

उत्तर

3

ठीक है, wss4j के स्रोत कोड में कुछ शोध के बाद, मुझे एहसास हुआ है कि हस्ताक्षर कार्रवाई (केवल) के मामले में WSS4JInInterceptor में कोई कॉलबैक हैंडलर नहीं है।

0

मैं तुम दोनों सर्वर और ग्राहक संदर्भों (अन्यथा आप केवल कार्रवाई पर हस्ताक्षर किया है) के लिए <entry key="action" value="UsernameToken Signature" /> जोड़ने की जरूरत है लगता है। क्लाइंट <entry key="passwordType" value="PasswordText" /> के लिए भी आवश्यक हो सकता है (मुझे यकीन नहीं है कि डिफ़ॉल्ट क्या है: सादा टेक्स्ट या पाचन, मुझे लगता है कि अंतिम)।

+0

आपके उत्तर के लिए धन्यवाद। लेकिन मैं केवल हस्ताक्षर तंत्र का उपयोग करना चाहता हूं। क्या यह संभव है? – Dmitry

+0

पासवर्ड के लिए, ऐसा लगता है कि कॉलबैक किसी भी तरह उपयोग में होना चाहिए। लेकिन यह निश्चित रूप से IMHO है) – Dmitry

+0

आपके मूल प्रश्न "क्यों 'पासवर्डकॉलबैक हैंडलर' नहीं कहा जाता है"। मैंने अपने जवाब में क्या रखा है: आपने उचित कार्रवाई को याद किया। अगर आपको केवल हस्ताक्षर की आवश्यकता है, तो आप केवल 'हस्ताक्षर' कार्रवाई छोड़ दें और दोनों सामग्री से 'पासवर्ड कॉलबैक' और 'उपयोगकर्ता' प्रविष्टियों को सुरक्षित रूप से हटा सकते हैं। मुझे उम्मीद है कि आप समझते हैं कि 'पासवर्ड कॉलबैक हैंडलर' को सीएक्सएफ ढांचे द्वारा एप्लिकेशन से पूछने के लिए कहा जाता है, यदि उपयोगकर्ता और पासवर्ड मान्य हैं, और यह हस्ताक्षर करने के लिए कुछ भी नहीं है। आपके कीस्टोर के लिए पासवर्ड को 'क्लाइंट/सर्वर.प्रोपर्टीज' में संगत रूप से परिभाषित किया जाना चाहिए। –

संबंधित मुद्दे