2011-08-23 44 views
4

我瞭解如何向SOAP請求添加標頭。但是,這會產生一個與我需要傳遞的不匹配的標題。返回此標題:將名稱空間添加到Suds中的默認WSSE安全對象

<SOAP-ENV:Header> 
     <wsse:Security mustUnderstand="true"> 
     <wsse:UsernameToken> 
      <wsse:Username>CABLE</wsse:Username> 
      <wsse:Password>CABLE</wsse:Password> 
     </wsse:UsernameToken> 
     </wsse:Security> 
    </SOAP-ENV:Header> 

不過,我需要修改頭的命名空間通過特定的命名空間的安全對象和UsernameToken的對象。我似乎無法弄清楚如何覆蓋提供的默認值。

<soapenv:Header> 
<wsse:Security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/07/secext"> 
     http://schemas.xmlsoap.org/ws/2002/07/secext 
<wsse:UsernameToken xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility"> 
<wsse:Username>CABLE</wsse:Username> 
<wsse:Password Type="wsse:PasswordText">CABLE</wsse:Password> 
</wsse:UsernameToken> 
</wsse:Security> 
</soapenv:Header> 

這裏是Python代碼,以生成上述

security = Security() 
token = UsernameToken('CABLE', 'CABLE') 
security.tokens.append(token) 
client.set_options(wsse=security) 

回答

3

了它。這是答案。只需要使用ns參數

def createWSSecurityHeader(username,password): 
    # Namespaces 
    wsse = ('wsse', 'http://schemas.xmlsoap.org/ws/2002/07/secext') 

    # Create Security Element 
    security = Element('Security', ns=wsse) 

    # Create UsernameToken, Username/Pass Element 
    usernametoken = Element('UsernameToken', ns=wsse) 
    uname = Element('Username', ns=wsse).setText(username) 
    passwd = Element('Password', ns=wsse).setText(password) 

    # Add Username and Password elements to UsernameToken element 
    usernametoken.insert(uname) 
    usernametoken.insert(passwd) 

    security.insert(usernametoken) 
    return security 
+2

謝謝!它還解決了我在密碼元素上使用suds wsse支持和缺少類型屬性的問題(使用passwd.set('Type',「http://docs.oasis-open.org/wss/2004/01/oasis-200401 -wss-username-token-profile-1.0#PasswordText「)來設置屬性。 – sunew

相關問題