【问题标题】:Security Policy for Apache CXF Java ClientApache CXF Java 客户端的安全策略
【发布时间】:2016-02-01 23:28:13
【问题描述】:

我的任务是为现有的 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 服务。

【问题讨论】:

    标签: java web-services soap wsdl cxf


    【解决方案1】:

    由于您使用的是 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 文件中提到的所有策略

    【讨论】:

      猜你喜欢
      • 2010-09-14
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      相关资源
      最近更新 更多