2012-11-18 13 views
5

मैंने कुछ ट्यूटोरियल्स के मैश अप का पालन किया है और न ही सफलतापूर्वक!अपाचे सीएक्सएफ और डब्ल्यूएस-सिक्योरिटी - पासवर्ड कॉलबैक

मैं अपने स्प्रिंग सुरक्षा प्रमाणीकरणकर्ता को वापस कॉल करने के लिए अपाचे सीएक्सएफ और डब्लूएस-सुरक्षा प्राप्त करने की कोशिश कर रहा हूं। सभी काम करने के करीब हैं लेकिन टनी पल में मुझे डब्लूएस-कॉल वापस स्प्रिंग सुरक्षा देने के लिए पासवर्ड प्राप्त करने में समस्या है।

नीचे हैंडलर galled हो जाता है लेकिन pc.getPassword() शून्य है। मैंने यह पासवर्ड साबुन में भेजा होना चाहता हूँ के रूप में तो

<bean id="wsAuthenticationInterceptor" class="com.olympus.viewtheworld.server.security.auth.WSAuthenticationInInterceptor"> 
    <constructor-arg index="0"> 
     <map key-type="java.lang.String" value-type="java.lang.Object"> 
      <entry key="action" value="UsernameToken" /> 
      <entry key="passwordType" value="PasswordText" /> 
      <entry key="passwordCallbackClass" value="com.olympus.viewtheworld.server.security.auth.ServerPasswordCallback" /> 
     </map> 
    </constructor-arg> 
    <property name="authenticationManager" ref="authenticationManager"/> 
</bean> 

<jaxws:endpoint id="secureHelloService" 
       implementor="#secureHelloServiceImpl" 
       implementorClass="com.olympus.viewtheworld.server.service.Impl.SecureHelloServiceImpl" 
       address="/SoapService/secure/hello"> 
    <jaxws:serviceFactory> 
     <ref bean="jaxws-and-aegis-service-factory" /> 
    </jaxws:serviceFactory> 
    <jaxws:inInterceptors> 
     <bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor"/> 
     <ref bean="wsAuthenticationInterceptor" /> 
    </jaxws:inInterceptors> 
</jaxws:endpoint> 

और साबुन अनुरोध मैं SoapUI से बाहर भेज रहा हूँ

है तो मैं इसे पारित वसंत के

public class ServerPasswordCallback implements CallbackHandler { 

public void handle(Callback[] callbacks) throws IOException, 
    UnsupportedCallbackException { 

    WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; 

    pc.setPassword(pc.getPassword()); 
} 

मेरे इंटरसेप्टर की स्थापना की है सकते हैं

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:test="http://test/"> 
    <soapenv:Header> 
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
<wsse:UsernameToken> 
<wsse:Username>rob2</wsse:Username> 
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">passwordxx</wsse:Password> 
</wsse:UsernameToken> 
</wsse:Security> 
</soapenv:Header> 
    <soapenv:Body> 
     <test:hello> 
     <!--Optional:--> 
     <hello>asdf</hello> 
     </test:hello> 
    </soapenv:Body> 
</soapenv:Envelope> 

संस्करण बुद्धिमान यह स्प्रिंग 3.1 और CXF 2.7.0

क्या मैं देख रहा हूँ करने के लिए क्या करने की जरूरत है "passwordxx है "ServerPasswordCallback कक्षा में? क्या यह साबुन अनुरोध है, कॉन्फ़िगर या सिर्फ गलत है ?!

चीयर्स, रोब

उत्तर

0

ठीक है तो यह आदर्श समाधान और उम्मीद है कि एक बेहतर जवाब लाइन नीचे बाद में थोड़ा के साथ आ जाएगा, सबसे अधिक संभावना है, जब मैं कुछ और समय इसे देखो करने की जरूरत नहीं है।

मैं पूर्ण पैकेट का निरीक्षण करने और पासवर्ड फ़ील्ड खींचने के लिए एक रेगेक्स का उपयोग करता हूं। कोड नीचे है। बाद में अपडेट किया जाएगा जब मैं ऐसा करने का सही तरीका काम करता हूं क्योंकि यह डिफिंटली नहीं है!

WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; 
     String mydata= pc.getRequestData().getMsgContext().toString();   
     Pattern pattern = Pattern.compile("<wsse:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\">(.*?)<"); 
     Matcher matcher = pattern.matcher(mydata); 
     if (matcher.find()) 
     { 
      pc.setPassword(matcher.group(1)); 
     } 
1

यह org.apache.ws.security.handler.WSHandlerConstants.PW_CALLBACK_CLASS पर दस्तावेज़ीकरण से प्रतीत होता है कि विधि के बजाय तर्क के रूप में के खिलाफ उपयोगकर्ता प्रदान की तुलना करने के लिए पासवर्ड संग्रहीत पासवर्ड के साथ pc.setPassword फोन, उपयोगकर्ता प्रदान की पासवर्ड खुद के बजाय चाहिए:

यह टैग पर पासवर्ड प्राप्त करने वाले कॉलबैक हैंडलर कार्यान्वयन वर्ग को संदर्भित करता है। इस टैग का मान का क्लास नाम होना चाहिए javax.security.auth.callback.CallbackHandler उदाहरण। कॉलबैक फ़ंक्शन

javax.security.auth.callback.CallbackHandler.handle(javax.security.auth.callback.Callback[])

org.apache.ws.security.WSPasswordCallback ऑब्जेक्ट की श्रृंखला हो जाता है। केवल सरणी की पहली प्रविष्टि का उपयोग किया जाता है। इस ऑब्जेक्ट में उपयोगकर्ता नाम/उपयोगकर्ता नाम पहचानकर्ता के रूप में शामिल है। कॉलबैक हैंडलर को पासवर्ड या इस पहचानकर्ता से संबंधित कुंजी को लौटने से पहले सेट करना होगा।

call.setProperty(WSHandlerConstants.PW_CALLBACK_CLASS, "PWCallbackClass");


मैं आपूर्ति पासवर्ड की वैधता की जांच करने के लिए एक org.apache.ws.security.validate.Validator उपयोग कर रहा हूँ, और वहाँ वसंत सुरक्षा संदर्भ की स्थापना:

एप्लिकेशन के पास निम्न विधि का उपयोग कर इस पैरामीटर सेट कर सकते हैं
@Bean(name = "wssforjInInterceptor") 
public WSS4JInInterceptor wssforjInInterceptor() { 
    // Configure how we ask for username and password 
    Map<String, Object> props = new HashMap<>(); 
    props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN); 
    props.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT); 

    // Password callback 
    props.put(WSHandlerConstants.PW_CALLBACK_REF, passwordCallbackHandler()); 

    // Validator registration 
    Map<QName, Object> validators = new HashMap<>(); 
    String WSS_WSSECURITY_SECEXT_1_0_XSD = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; 
    QName qName = new QName(WSS_WSSECURITY_SECEXT_1_0_XSD, WSHandlerConstants.USERNAME_TOKEN, ""); 
    validators.put(qName, usernameTokenValidator()); 
    props.put(WSS4JInInterceptor.VALIDATOR_MAP, validators); 

    WSS4JInInterceptor wss4jInInterceptor = new WSS4JInInterceptor(props); 
    return wss4jInInterceptor; 
} 

मुझे यकीन नहीं है कि यह दृष्टिकोण कोई बेहतर या बदतर है (मैं इस पर कुछ प्रतिक्रिया की सराहना करता हूं), लेकिन शायद यह उपयोगी है अगले व्यक्ति को इस मुद्दे पर आने के लिए। वसंत सुरक्षा और सीएक्सएफ को एकीकृत करने के तरीके पर सभ्य अद्यतित दस्तावेज की कमी प्रतीत होती है।

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