Question

J'utilise Apache CXF dernier pour créer un webservice. J'ai configuré ws-sécurité à l'aide org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor. Dans mon passwordCallbackClass je peux accéder à l'utilisateur ou l'identifiant en appelant getIdentifier() méthode de classe org.apache.ws.security.WSPasswordCallback.

J'utilise également le printemps pour l'ensemble de l'installation.

Je voudrais savoir comment accéder à l'identifiant tout où ailleurs dans le code? Je ne pouvais penser à utiliser ThreadLocal dans mon passwordCallbackClass? Une autre façon est de définir une propriété d'identifiant dans tous mes paramètres de la méthode de service, mais qui ont besoin de client signifie passer l'identifiant deux fois, l'un dans le bloc de sécurité et de nouveau dans l'appel de service?


Modifier

regarde ma classe de service comme celui-ci et je dois lire l'identificateur de méthode sayHi.

@WebService(endpointInterface = "com.webservice.HelloWorld")  
public class HelloWorldImpl implements HelloWorld {  
    public String sayHi(String text) {  
        return "Hello " + text;  
    }  
}

Ma méthode de rappel de mot de passe est ce où je peux obtenir l'identifiant.

public void handle(Callback[] callbacks) throws IOException,UnsupportedCallbackExceptio {  
    WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];  
    pc.getIdentifier();  
}
Était-ce utile?

La solution

je ThreadLocal dans ma méthode de rappel de mot de passe pour stocker l'identifiant. J'accède alors ThreadLocal partout dans le code pour connaître l'identifiant.

Autres conseils

Définir « toute autre où dans le code »? Parlez-vous dans d'autres intercepteurs? Dans votre implémentation du serveur? Utilisez-vous JAXWS ou le frontend simple? Etc ...

Si vous utilisez JAXWS et que vous voulez dans votre impl serveur, le JAXWS WebServiceContext a une méthode getUserPrincipal () qui serait juste un principe que WSS4J crée après avoir validé l'utilisateur.

Quasiment nulle part ailleurs (ou même dans le serveur impl en utilisant le contexte), vous pouvez faire quelque chose comme:

message.get (SecurityContext.class) .getUserPrincipal ();

pour obtenir le même résultat.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top