Domanda

Sto usando ultimo Apache CXF per creare un webservice. Ho configurato WS-Security con org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor. Nel mio passwordCallbackClass posso accedere l'utente o l'identificatore chiamando getIdentifier() metodo della classe org.apache.ws.security.WSPasswordCallback.

Sono anche utilizzando molla per l'intero setup.

Vorrei sapere come accedere l'identificatore qualsiasi altra parte nel codice? Potrei pensare di utilizzare ThreadLocal nel mio passwordCallbackClass? Un altro modo è definire a una proprietà identificatore in tutti i miei servizi parametri del metodo, ma che significherebbe client necessario per passare l'identificatore due volte, una nel blocco di sicurezza e di nuovo la chiamata di servizio?


Modifica

La mia classe di servizio assomiglia a questo e ho bisogno di leggere l'identificatore di metodo sayHi.

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

Il mio metodo di callback password è questo dove posso trovare l'identificatore.

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

Soluzione

ho usato ThreadLocal nel mio metodo di callback password per memorizzare l'identificatore. Ho poi accedere al ThreadLocal in qualsiasi parte del codice per conoscere l'identificativo.

Altri suggerimenti

Definisci "qualsiasi altra parte nel codice"? Stai parlando in altri intercettori? Nella tua implementazione del server? Si sta utilizzando jaxws o il semplice frontend? Ecc ...

Se si utilizza jaxws e si desidera nei vostri impl server, il jaxws WebServiceContext ha un metodo getUserPrincipal (), che sarebbe solo un principio che WSS4J crea dopo aver convalidare l'utente.

Praticamente in qualsiasi altro luogo (o anche nelle impl server utilizzando il contesto), si può fare qualcosa di simile:

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

per ottenere lo stesso risultato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top