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

时间:2009-11-12 04:27:07

标签: java cxf ws-security

我正在使用最新的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();  
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

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

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

获得相同的结果。