2016-06-28 2 views
0

Mon exigence est de mettre en œuvre une méthode pour générer des en-têtes de sécurité ws en utilisant un nom d'utilisateur entrant, mot de passe. Donc, quelqu'un peut invoquer ma méthode de xslt en fournissant un nom d'utilisateur et un mot de passe et ma méthode devrait pouvoir retourner les en-têtes de sécurité et ajouter ces en-têtes de sécurité dans une demande de savon pour appeler un service web tiers. Je suis à la recherche d'API qui peut générer des en-têtes de sécurité de savon en prenant nom d'utilisateur et mot de passe.En-têtes de sécurité cxf pour client utilisant Java

J'ai trouvé WSS4JOutInterceptor qui a besoin d'informations de port et de service, mais dans mon cas je n'ai que 2 paramètres (UserName, PassWord).

S'il vous plaît suggérer s'il existe d'autres api/approches que de créer SoapEnvelop et d'y ajouter des éléments de sécurité?

<oas:Security xmlns:oas="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">  <oas:UsernameToken xmlns:oas1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" oas1:Id="UsernameToken-1">  <oas:Username> lakshmi </oas:Username><oas:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">MTQ2NzA5NTg3MjM5Mw==</oas:Nonce>  <oas:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">uSlFkVhDynZoCXFojlM1w4UrJYY=</oas:Password><oas1:Created>2016-06-28T06:37:52.425Z</oas1:Created></oas:UsernameToken></oas:Security> 
+0

Quelle ist la raison de construire votre demande avec xslt lors de l'utilisation CxF? Quelle devrait être la sortie de votre méthode? Un xmlstring? S'il vous plaît ajouter plus d'informations de ce dont vous avez besoin exactement. – Frank

+0

@Frank vous êtes Wright. La sortie de ma méthode doit être xmlString. Dans notre projet, nous convertissons la requête entrante (XML) en format soap via xslt seulement. Peut-être que je me suis trompé en post, nous n'utilisons aucun CXF pour convertir le XML entrant au format SOAP. L'exigence actuelle consiste à créer un en-tête de sécurité en prenant le nom d'utilisateur et le mot de passe. – lkreddy1231

+0

Vous devez donc générer l'en-tête de savon pour les connexions sortantes et ne pas vous soucier de la façon dont le corps est généré: xslt etc N'est-ce pas? Probablement vous n'avez pas besoin de CXF. S'il vous plaît ajouter un exemple du format d'en-tête désiré si vous savez, ou au moins des restrictions de jeton de sécurité binaires définies par votre serveur – pedrofb

Répondre

1

Vous pouvez utiliser WSS4J pour générer l'en-tête de sécurité

public Node buildSecurityHeader(String username, String password) 
     throws WSSecurityException, ParserConfigurationException, SAXException, IOException{ 

    //XML Document builder with a root node 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    factory.setNamespaceAware(true); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    InputSource inStream = new InputSource(); 
    inStream.setCharacterStream(new StringReader("<root></root>")); 
    Document document = builder.parse(inStream); 

    //<wsse:UsernameToken> 
    WSSecUsernameToken usernametoken = new WSSecUsernameToken(); 
    usernametoken.setPasswordType(WSConstants.PASSWORD_DIGEST); 
    usernametoken.setUserInfo(username, password); 

    //<wsse:Security> 
    WSSecHeader secHeader = new WSSecHeader(document); 
    secHeader.insertSecurityHeader(); 

    //Generates the Document with <root><Header><wsse:Security>... 
    usernametoken.build(document, secHeader); 

    //Extract the desired node 
    Node securityNode = document.getElementsByTagName("wsse:Security").item(0); 

    return securityNode; 

} 

Pour imprimer le nœud sous forme de chaîne utiliser cette

public String nodeToString(Node node) throws TransformerFactoryConfigurationError, TransformerException { 
    StringWriter sw = new StringWriter(); 

    Transformer t = TransformerFactory.newInstance().newTransformer(); 
    t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
    t.setOutputProperty(OutputKeys.INDENT, "yes"); 
    t.transform(new DOMSource(node), new StreamResult(sw)); 
    return sw.toString(); 
} 

et de l'utiliser de cette manière

String securityHeader = nodeToString(buildSecurityHeader(username,password)); 

T Le résultat sera similaire à ceci. Le paramètrer WSSecUsernameToken et WSSecHeader le code à votre convenance

<wsse:Security xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" soapenv:mustUnderstand="1"> 
    <wsse:UsernameToken wsu:Id="UsernameToken-39dba965-c4a8-4b2d-826e-ade8c0931f3f"> 
     <wsse:Username>username</wsse:Username> 
     <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">BxJH0G5PzPfBFbBGimF0bq3vjsY=</wsse:Password> 
     <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">iaO1xilL6qfuN2apbSdfPQ==</wsse:Nonce> 
     <wsu:Created>2016-06-30T07:17:26.552Z</wsu:Created> 
    </wsse:UsernameToken> 
</wsse:Security>