1

我正在使用最新的 Apache CXF 创建 Web 服务。我已经使用org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor. 在我的passwordCallbackClass我可以通过调用类的getIdentifier()方法来访问用户或标识符org.apache.ws.security.WSPasswordCallback

我也在整个设置中使用弹簧。

我想知道如何在代码中的其他任何地方访问标识符?我可以考虑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();  
}
4

2 回答 2

2

我在密码回调方法中使用 ThreadLocal 来存储标识符。然后我在代码中的任何位置访问 ThreadLocal 以了解标识符。

于 2009-12-16T02:43:38.570 回答
1

定义“代码中的任何其他位置”?您是在谈论其他拦截器吗?在您的服务器实现中?您使用的是 JAXWS 还是简单的前端?ETC...

如果使用 jaxws 并且您希望在服务器 impl 中使用它,则 JAXWS WebServiceContext 有一个 getUserPrincipal() 方法,该方法只是 WSS4J 在您验证用户后创建的主体。

几乎在其他任何地方(甚至在使用上下文的服务器 impl 中),您都可以执行以下操作:

message.get(SecurityContext.class).getUserPrincipal();

达到同样的效果。

于 2009-11-12T21:33:27.167 回答