1

CXF-BC と CXF-SE の組み合わせで Ws-Security が動作するようになりました。SE の SOAP ヘッダーからユーザー名にアクセスして、操作を呼び出しているユーザーの権限と所有権を確認しようとしていますが、それを行う方法はないようです。メッセージが BC から SE に渡されると、SOAP 本体を取得して JBI メッセージでラップするだけであることがわかっています。JBIメッセージにsoapヘッダーを詰め込む方法はありますか、またはBCが受信したSOAPメッセージを真に転送するようにします。BC と SE で JBIwrapper を無効にしようとしましたが、メッセージは SOAP として送信されますが、元の msg san ヘッダーの本文のみが送信されます。

JAXWS では比較的簡単に実行できたのに、なぜこれを BC/SE で実行するのがそれほど難しく複雑なのか、私にはわかりません。

ありがとう

4

1 に答える 1

0

この回答は、Servicemix-user メーリング リストで Freeman から寄せられたものです。

基本的に、BC のインターセプターで JBI プロパティを設定する必要があり、それから SE でアクセスできます。

元。インインターセプター

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ポジョの元

@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"); 

これが他の誰かに役立つことを願っています。ここにws-security ポリシー を使用
した完全な例がありますが、これは限られた時間しか存在しません。

于 2010-06-30T03:10:54.137 に答える