Apache CXF Java客户端的安全策略

时间:2016-02-01 23:28:14

标签: java web-services soap wsdl cxf

我被赋予了为现有Soap Web服务创建Java客户端的任务,其安全策略定义如下:

<wsp:Policy wsu:Id="security_policy_id">
    <wsp:ExactlyOne>
        <wsp:All>
            <sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                <wsp:Policy>
                    <sp:TransportToken>
                        <wsp:Policy>
                            <sp:HttpsToken RequireClientCertificate="false"/>
                        </wsp:Policy>
                    </sp:TransportToken>
                    <sp:AlgorithmSuite>
                        <wsp:Policy>
                            <sp:Basic256/>
                        </wsp:Policy>
                    </sp:AlgorithmSuite>
                    <sp:Layout>
                        <wsp:Policy>
                            <sp:Lax/>
                        </wsp:Policy>
                    </sp:Layout>
                    <sp:IncludeTimestamp/>
                </wsp:Policy>
            </sp:TransportBinding>
            <sp:SignedSupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                <wsp:Policy>
                    <sp:UsernameToken
                            sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient">
                        <wsp:Policy>
                            <sp:WssUsernameToken10/>
                        </wsp:Policy>
                    </sp:UsernameToken>
                </wsp:Policy>
            </sp:SignedSupportingTokens>
            <sp:Wss10 xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                <wsp:Policy/>
            </sp:Wss10>
        </wsp:All>
    </wsp:ExactlyOne>
</wsp:Policy>

我已经通过Maven和wsdl2java生成了存根,但我还没有成功进行身份验证。我不知道从哪里开始在客户端履行政策。我仅使用UsernameToken或X.509证书找到了几个示例,但没有任何明显的复杂性。我努力把所有的东西放在一起。以下是来自CXF网站的示例,希望这是我正在寻找的内容。

        Client client = ClientProxy.getClient(greeter);
        Map<String, Object> props = new HashMap<String, Object>();
        props.put("action", "UsernameToken");
        props.put("user", "alice");
        props.put("passwordType", "PasswordText");
        WSS4JOutInterceptor wss4jOut = new WSS4JOutInterceptor(props);

        client.getOutInterceptors().add(wss4jOut);    ((BindingProvider)greeter).getRequestContext().put("password","password");

注意:我无法控制wsdl或Web服务。

1 个答案:

答案 0 :(得分:0)

由于您使用的是CXF中的wsdl2java maven插件,因此会生成很多类,包括Service类。 所以你需要做的是从生成的服务类中获取存根并注入提供的用户名和密码,然后它应该工作。像这样:

final YourService service = new YourService();
final YourStub stub = service.getService();

final Map ctx = ((BindingProvider)stub).getRequestContext();

ctx.put("ws-security.username", userName);
ctx.put("ws-security.password", password);

stub.callYourMethod();

PS:请确保您拥有正确的库,我只是使用了cxf-bundle而没有使用cxf,而且它有效!之前它不起作用,因为我单独包含来自cxf的库。

代码将自动处理wsdl文件中提到的所有策略