Как получить доступ к принципу имени пользователя в cxf-se с помощью ws-security? - PullRequest
1 голос
/ 24 июня 2010

Наконец-то я получил Ws-Security, работающую с комбинацией CXF-BC и CXF-SE. Сейчас я пытаюсь получить доступ к имени пользователя из заголовка мыла в SE, чтобы проверить разрешение и право собственности пользователя, вызывающего операцию, но, похоже, нет способа сделать это. Я знаю, что как только сообщение передается от BC к SE, оно просто принимает тело SOAP и помещает его в сообщение JBI. Есть ли в любом случае, чтобы вставить мыльный заголовок в сообщение JBI или, чтобы BC действительно пересылал сообщение SOAP, как оно его получило. Я попытался отключить JBIwrapper на BC и SE, в то время как он отправляет сообщение в виде SOAP, он только отправляет тело исходного заголовка msg san.

Я не уверен, почему это так сложно и сложно сделать на BC / SE, поскольку это было относительно легко сделать с JAXWS.

Спасибо

1 Ответ

0 голосов
/ 30 июня 2010

Этот ответ пришел от Фримена из списка рассылки пользователей Servicemix.

По сути, вы должны установить свойство JBI для интеринцептора BC, а затем вы можете получить к нему доступ через SE.

ех. 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;
            }
        }
    }
}

} 

из 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"); 

Надеюсь, это поможет кому-то еще.
У меня есть полный пример здесь w / ws-security policy, но он существует только в течение ограниченного периода времени.

...