2013-08-16 2 views
1

У меня есть файл WSDL и я пишу клиент для этого в России было 8,0WS Security - Имя пользователя лексема Профиль

Я сохранил имя пользователя/пароль, необходимые для запроса мыла в ApplicationResources.properties.

Я использую «WSS-имя пользователя-токен-профиль-1,0»,

Я не могу найти, как это реализовать.

Мне нужно знать, как написать policy.xml и как использовать в Webservice clienr.

ответ

3

Запрос Soap должен содержать соответствующие элементы заголовка для имени пользователя wess wess. Либо вы можете вручную создать элементы с помощью обработчика Soap или SAAJ, если вы используете Java. В Websphere вы можете использовать функцию «наборы политик» для метапрограммы этой поддержки с настройкой различных наборов политик и привязок.

Вот хорошая статья, описывающая, как это делается с использованием метода конфигурации: http://www.ibm.com/developerworks/websphere/library/techarticles/1103_balakrishnan/1103_balakrishnan.html

Вот пример добавления этой заголовки программно с помощью SAAJ:

public class WssHandler implements SOAPHandler<SOAPMessageContext> { 

    private static final Logger cTRACE = Logger.getLogger(WssHandler.class.getName()); 

    // SOAP 
    private static final String cWSSE = "wsse"; 
    private static final String cURL = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; 
    private static final String cNODE_SECURITY = "Security"; 
    private static final String cNODE_USRTOKEN = "UsernameToken"; 
    private static final String cNODE_USERNAME = "Username"; 
    private static final String cNODE_PASSWORD = "Password"; 

    private String iUsername; 
    private String iPassword; 

    /** 
    * Constructor for SOAP handler with specific wss credentials. 
    * @param aUsername wss username 
    * @param aPassword wss password 
    */ 
    public WssHandler(String username, String passwd) { 
     super(); 
     iUsername = username; 
     iPassword = passwd; 
    } 

    @Override 
    public boolean handleMessage(SOAPMessageContext context) { 
     if (cTRACE.isLoggable(Level.FINEST)) { 
      cTRACE.logp(Level.FINEST, 
        WssHandler.class.getName(), 
        "handleMessage", "add WSS credentials for user "+iUsername); 
     } 

     try { 
      SOAPMessage tMessage = context.getMessage(); 
      SOAPEnvelope tSoapEnvelope = tMessage.getSOAPPart().getEnvelope(); 

      // header 
      SOAPHeader tHeader = tSoapEnvelope.getHeader(); 
      if (tHeader==null) { 
       // no header yet, create one 
       tHeader = tSoapEnvelope.addHeader(); 
      } 

      // security node 
      Name tWsseHeaderName = tSoapEnvelope.createName(cNODE_SECURITY, cWSSE, cURL); 
      SOAPHeaderElement tSecurityElement = tHeader.addHeaderElement(tWsseHeaderName); 
      tSecurityElement.setMustUnderstand(true); 

      Name tUserTokenElementName = tSoapEnvelope.createName(cNODE_USRTOKEN, cWSSE, cURL); 
      SOAPElement tUserTokenElement = tSecurityElement.addChildElement(tUserTokenElementName); 
      tUserTokenElement.removeNamespaceDeclaration(cWSSE); 
      tUserTokenElement.addNamespaceDeclaration("wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"); 

      // user name child 
      Name tUsernameElementName = tSoapEnvelope.createName(cNODE_USERNAME, cWSSE, cURL); 
      SOAPElement tUsernameElement = tUserTokenElement.addChildElement(tUsernameElementName); 
      tUsernameElement.removeNamespaceDeclaration(cWSSE); 
      tUsernameElement.addTextNode(iUsername); 

      // password child 
      Name tPasswordElementName = tSoapEnvelope.createName(cNODE_PASSWORD, cWSSE, cURL); 
      SOAPElement tPasswordElement = tUserTokenElement.addChildElement(tPasswordElementName); 
      tPasswordElement.removeNamespaceDeclaration(cWSSE); 
      tPasswordElement.addTextNode(iPassword); 
      tPasswordElement.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"); 
     } catch (SOAPException e) { 
      if (cTRACE.isLoggable(Level.SEVERE)) { 
       cTRACE.logp(Level.SEVERE, 
         WssHandler.class.getName(), 
         "handleMessage", "Unable to add WSS credentials", e); 
      } 
      // stop processing 
      return false; 
     } 

     // continue processing 
     return true; 
    } 

    @Override 
    public boolean handleFault(SOAPMessageContext context) { 
     return true; 
    } 

    @Override 
    public void close(MessageContext context) { 
     // nothing to do 
    } 

    @Override 
    public Set<QName> getHeaders() { 
     return null; 
    } 

} 
+0

У меня есть UsernameToken в XML и я хотите передать этот токен программно. Как передать этот токен при вызове webservice? (я использую MyEclipse Blue и WAS8.0) – Phanindar

+1

Это заслуживает большего количества голосов и должно быть принято в качестве ответа. –

+1

Я ценю, что ... –