8
votes

Apache CXF - Les informations d'identification ne sont pas envoyées de wss4joutinterceptor?

J'essaie de vous connecter à un service Web à l'aide de WS-Security UsernameToken Spec 1.0, Utilisation d'Apache CXF 2.4.0.

J'ai copié le code ci-dessous dans les documents CXF, mais je reçois: org.apache.cxf.ws.policy.policyException: aucun nom d'utilisateur disponible p>

public class ClientPasswordHandler implements CallbackHandler {
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
    WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
    pc.setPassword("Password");     
    }
}


0 commentaires

3 Réponses :


19
votes

Obtenez-vous la facturation exceptionnelle du côté du client? Si tel est le cas, cela signifie probablement que le WSDL que vous utilisez a un fragment WS-SecucurityPolicy qui décrit la politique userneToken qu'elle souhaite et s'attend à elle. Si tel est le cas, vous ne devriez pas du tout configurer le WSS4JOUTTITIN. L'exécution WS-Policy Runtime le gérera et il vous suffit de fournir des propriétés qu'il peut avoir besoin.

Les docs pour la Securitypolicy Stuff sont à: http://cxf.apache.org/docs/ws-securitypolicy.html p>

Vous avez probablement besoin d'utiliser: p >

Map ctx = ((BindingProvider)port).getRequestContext();
ctx.put("ws-security.username", "USERNAME");
ctx.put("ws-security.password", "Password");


3 commentaires

Daniel Kulp Votre réponse n'a pas fonctionné pour moi. Je vois la console et l'exception est la suivante: exception générale de sécurité Web Service


Merci Daniel. Je cherchais cela pendant des heures.


Daniel, ça pourrait être trop vieux. Mais, je dois savoir si j'aime bien mon type de mot de passe pour être un texte et que je souhaite ajouter une nonce, comment puis-je le faire ici?



1
votes

On utilise la réponse de Daniel, j'avais l'exception suivante xxx pré>

J'ai utilisé ci-dessous et a commencé à fonctionner p>

Map ctx = ((BindingProvider) ssPort).getRequestContext();
        ctx.put(BindingProvider.USERNAME_PROPERTY, "user");
        ctx.put(BindingProvider.PASSWORD_PROPERTY, "pass");
        ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://c


0 commentaires

2
votes

Merci à Daniel la configuration de travail complète pour moi est la suivante:

    webServicePort = webService_service.getPort(WebService.class);

    Client client = ClientProxy.getClient(webServicePort);

    Endpoint cxfEndpoint = client.getEndpoint();

    Map<String, Object> props = ((BindingProvider) webServicePort).getRequestContext();
    props.put("ws-security.username", PravoRuConstants.USERNAME);
    props.put("ws-security.password", PravoRuConstants.PASSWORD);

    props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
    props.put(WSHandlerConstants.USER, PravoRuConstants.USERNAME);
    props.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);

    props.put(WSHandlerConstants.PW_CALLBACK_CLASS, PravoRuPasswordHandler.class.getName());

    WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(props);
    cxfEndpoint.getOutInterceptors().add(wssOut);


1 commentaires

Votre configuration fonctionne aussi pour moi, avec juste une "petite" différence. Je ne devais pas ajouter l'intercepteur à l'extrémité des intercepteurs (dernière ligne de votre extrait) sinon je reçois l'en-tête USERNAME_Token imprimé deux fois dans ma demande.