Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何读取ws-security中提供的用户或标识符_Java_Cxf_Ws Security - Fatal编程技术网

Java 如何读取ws-security中提供的用户或标识符

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

我正在使用最新的ApacheCXF创建Web服务。我已经使用
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();  
}