Java 如何读取ws-security中提供的用户或标识符
我正在使用最新的ApacheCXF创建Web服务。我已经使用Java 如何读取ws-security中提供的用户或标识符,java,cxf,ws-security,Java,Cxf,Ws Security,我正在使用最新的ApacheCXF创建Web服务。我已经使用org.apache.cxf.ws.security.wss4j.wss4jinterceptor配置了ws-security。在我的passwordCallbackClass中,我可以通过调用org.apache.ws.security.WSPasswordCallback类的getIdentifier()方法来访问用户或标识符 我还使用spring进行整个设置 我想知道如何在代码中的任何其他位置访问标识符?我可以考虑在我的passw
org.apache.cxf.ws.security.wss4j.wss4jinterceptor
配置了ws-security。在我的passwordCallbackClass
中,我可以通过调用org.apache.ws.security.WSPasswordCallback
类的getIdentifier()
方法来访问用户或标识符
我还使用spring进行整个设置
我想知道如何在代码中的任何其他位置访问标识符?我可以考虑在我的passwordCallbackClass
中使用ThreadLocal
?另一种方法是在我的所有服务方法参数中定义标识符属性,但这意味着客户端需要传递标识符两次,一次在安全块中,另一次在服务调用中
编辑 我的服务类如下所示,我需要读取
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();
}
定义“代码中的任何其他位置”?你是说在其他的拦截器里?在您的服务器实现中?您使用的是JAXWS还是简单前端?等等
如果使用jaxws并且希望在服务器impl中使用它,那么jaxws WebServiceContext有一个getUserPrincipal()方法,该方法将是WSS4J在验证用户后创建的主体
几乎在其他任何地方(甚至在使用上下文的服务器impl中),您都可以执行以下操作:
get(SecurityContext.class).getUserPrincipal()
为了获得相同的结果。我在密码回调方法中使用了ThreadLocal来存储标识符。然后,我访问代码中任意位置的ThreadLocal以了解标识符
public void handle(Callback[] callbacks) throws IOException,UnsupportedCallbackExceptio {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
pc.getIdentifier();
}