Domanda

Finalmente ho avuto la WS-Security lavorare con CXF-BC & combinazione CXF-SE. Ora sto cercando di accedere al nome utente dall'intestazione sapone nella SE per controllare l'autorizzazione e la proprietà del l'utente chiamante un'operazione, ma sembra che ci sia alcun modo di farlo. So che una volta che un messaggio viene passato dal aC al SE, ci vuole solo il corpo SOAP e avvolge in un msg JBI. Esiste un modo per roba l'intestazione sapone nella msg JBI o, hanno il BC veramente avanti il ??msg SOAP in quanto ha ricevuto. Ho provato a disattivare il JBIwrapper sulla aC e SE, mentre invia il messaggio come SOAP invia solo il corpo del msg originale san intestazione.

Io non sono sicuro perché questo è così difficile e complesso per fare questo sul BC / SE, dal momento che è stato relativamente facile da fare con jaxws.

Grazie

È stato utile?

Soluzione

Questa risposta è arrivata da Freeman sopra al servicemix-mailing list degli utenti.

In pratica dovete impostare una proprietà di JBI su ininterceptor di un jacket, e quindi è possibile accedervi sopra sulla SE.

es. ininterceptor

public class SaveSubjectInterceptor extends AbstractPhaseInterceptor {

public SaveSubjectInterceptor() {
    super(Phase.PRE_INVOKE);
}

public void handleMessage(Message message) throws Fault {
    List<Object> results = (List<Object>) message.get(WSHandlerConstants.RECV_RESULTS);
    if (results == null) {
        return;
    }

    for (Iterator iter = results.iterator(); iter.hasNext();) {
        WSHandlerResult hr = (WSHandlerResult) iter.next();
        if (hr == null || hr.getResults() == null) {
            return;
        }
        boolean authenticated = false;

        for (Iterator it = hr.getResults().iterator(); it.hasNext();) {
            WSSecurityEngineResult er = (WSSecurityEngineResult) it.next();
            Object wstockPrincipal = er.get(WSSecurityEngineResult.TAG_PRINCIPAL);
            if (er != null && wstockPrincipal instanceof WSUsernameTokenPrincipal) {
                WSUsernameTokenPrincipal p = (WSUsernameTokenPrincipal) wstockPrincipal;
                NormalizedMessage nm = (NormalizedMessage) message.getContent(NormalizedMessage.class);
                nm.setProperty("Username", p.getName());
                break;
            }
        }
    }
}

} 

ex di SE POJO

@Resource 
private WebServiceContext wsContext; 

...
...
javax.xml.ws.handler.MessageContext ctx = wsContext.getMessageContext(); 
org.apache.cxf.message.Message message = ((org.apache.cxf.jaxws.context.WrappedMessageContext) ctx).getWrappedMessage(); 
String username = (String) message.get("Username"); 

Spero che questo aiuta a qualcun altro.
Ho un esempio completo qui w politica / WS-Security, ma è solo per un periodo limitato di tempo.

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