2010-06-24 3 views
1

J'ai enfin obtenu le Ws-Security fonctionnant avec CXF-BC & combinaison CXF-SE. J'essaye maintenant d'accéder au nom d'utilisateur de l'en-tête de savon dans le SE pour vérifier la permission et la propriété de l'utilisateur appelant une opération, mais il semble n'y avoir aucun moyen de faire cela. Je sais qu'une fois qu'un message est passé du BC au SE, il prend juste le corps de SOAP et enveloppe dans un message JBI. Est-il de toute façon pour bourrer l'en-tête de savon dans le JBI JBI ou, avoir le BC vraiment transmettre le message SOAP comme il l'a reçu. J'ai essayé de désactiver le JBIwrapper sur le BC et le SE, pendant qu'il envoie le message en tant que SOAP il envoie seulement le corps de l'en-tête original de msg san. Je ne sais pas pourquoi c'est si difficile et si complexe de faire cela sur le BC/SE, car c'était relativement facile à faire avec JAXWS.Comment accéder au principe du nom d'utilisateur dans un cxf-se avec ws-security?

Merci

Répondre

0

Cette réponse est venue de Freeman sur à la mailing-list ServiceMix utilisateur.

Fondamentalement, vous devez définir une propriété JBI sur un intercepteur de la BC, puis vous pouvez y accéder sur le SE.

ex. 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 de 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"); 

J'espère que cela aide quelqu'un d'autre.
J'ai un exemple complet here w/ws-politique de sécurité, mais il est seulement là pour une durée limitée.

Questions connexes