这个答案来自 Freeman 在 Servicemix-user 邮件列表。
基本上你必须在 BC 的 ininterceptor 上设置一个 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 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");
我希望这对其他人有帮助。
我在这里有一个带有 ws-security 策略的完整示例,但它只存在有限的时间。