2009-04-01 11 views

Répondre

24

Ceci est couvert par la spécification JAX-WS. Fondamentalement, définissez le nom d'utilisateur/mot de passe en tant que propriétés sur le contexte de la demande:

((BindingProvider)proxy).getRequestContext().put(
    BindingProvider.USERNAME_PROPERTY, "joe"); 
((BindingProvider)proxy).getRequestContext().put(
    BindingProvider.PASSWORD_PROPERTY, "pswd"); 

Le temps d'exécution les met dans l'en-tête HTTP.

+5

Peut être utile de mentionner que vous avez juste besoin de cast le port CXF: BindingProvider portBP = (BindingProvider) port; portBP.getRequestContext(). Put (BindingProvider.USERNAME_PROPERTY, "nom d'utilisateur"); portBP.getRequestContext(). Put (BindingProvider.PASSWORD_PROPERTY, "mot de passe"); – Francois

6

Il y a une bien meilleure façon:

lors de la génération Java à partir WSDL, ajouter l'option "-exsh true":

wsdl2java de vrai -p edu.sharif.ce http://wsdl.ir/WebServices/WebService.asmx?WSDL

et ajouter UserCredential lors de l'utilisation:

UserCredentials user = new UserCredentials(); 
user.setUserid("user"); 
user.setPassword("pass"); 

ResearchWebService_Service service = new ResearchWebService_Service(); 
ResearchWebService port = service.getResearchWebService(); 
port.addNewProject(newProject, user); 
+0

Etes-vous sûr que cela activera l'authentification de base dans les en-têtes de requête HTTP? Cela définira probablement les informations d'identification dans le message SOAP au lieu de définir un en-tête HTTP Authorization ... (comme les docs disent que cela fonctionne sur les 'en-têtes de soap implicites') – Geert

7

Vous pouvez fournir votre propre authentificateur. De cette façon, cela fonctionnera si le WDSL lui-même est protégé par l'authentification HTTP de base.

@WebServiceRef(wsdlLocation = "https://laka/sito?wsdl") 
static XxxService service; 

public static void main(String[] args) { 

    Authenticator.setDefault(new Authenticator() { 
     @Override 
     protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication("user", "password".toCharArray()); 
     } 
    }); 

    service = new XxxService(); 
    Xxx port = service.getXxxPort(); 

    // invoke webservice and print response 
    XxxResponse resp = port.foo(); 
    System.out.println(resp.toString()); 

} 
+0

Notez que la méthode 'Authenticator.setDefault (Authenticator)' est statique et s'applique donc à tous vos fils. Cependant, il est assez facile de contourner cela en utilisant une variable ThreadLocal pour enregistrer différentes informations d'authentification par thread. – Marco

+1

Je vois 'Authenticator.setDefault' est statique mais c'est aussi une méthode synchronisée. Est-ce vraiment nécessaire d'utiliser ThreadLocal? –

Questions connexes