我正在使用最新的Apache CXF来创建Web服务。我使用org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor
配置了ws-security。在我的passwordCallbackClass
中,我可以通过调用getIdentifier()
类的org.apache.ws.security.WSPasswordCallback
方法来访问用户或标识符。
我也在使用spring进行整个设置。
我想知道如何访问代码中的其他位置的标识符?我可以考虑在ThreadLocal
中使用passwordCallbackClass
吗?另一种方法是在我的所有服务方法参数中定义一个标识符属性,但这意味着客户端需要两次传递标识符,一个在安全块中,另一个在服务调用中?
<小时/> 的修改
我的服务类看起来像这样,我需要在sayHi
方法中阅读标识符。
@WebService(endpointInterface = "com.webservice.HelloWorld")
public class HelloWorldImpl implements HelloWorld {
public String sayHi(String text) {
return "Hello " + text;
}
}
我的密码回调方法是我可以获取标识符的地方。
public void handle(Callback[] callbacks) throws IOException,UnsupportedCallbackExceptio {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
pc.getIdentifier();
}
答案 0 :(得分:2)
我在密码回调方法中使用ThreadLocal来存储标识符。然后,我在代码中的任何位置访问ThreadLocal以了解标识符。
答案 1 :(得分:1)
定义“代码中的任何其他位置”?你在谈论其他拦截器吗?在你的服务器实现?您使用的是JAXWS还是简单的前端?等...
如果使用jaxws并且您希望它在您的服务器impl中,那么JAXWS WebServiceContext有一个getUserPrincipal()方法,它只是WSS4J在验证用户后创建的主体。
几乎在其他任何地方(甚至在使用上下文的服务器impl中),您可以执行以下操作:
message.get(SecurityContext.class).getUserPrincipal();
获得相同的结果。