我尝试使用UsernameTokenSignature设置CXF服务和客户端。 Startingpoint是一个现有的,代码优先的服务。不幸的是,我发现的所有示例都使用了WS-Policy,正如我所理解的那样,CXF在代码优先方案中不支持。
我设法创建了一个客户端,它使用此配置发送消息,如我所期望的那样:
客户端:
<jaxws:client id="clientWithUsernameTokenSignature" serviceClass="mypackage.MyServiceInterface" address="http://localhost:8081/ws-security-secured-soap-service/services/Service_v1">
<jaxws:outInterceptors>
<ref bean="WSS4JOutInterceptor_UsernameTokenSignature" />
</jaxws:outInterceptors>
</jaxws:client>
WSS4JOutInterceptor
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor" id="WSS4JOutInterceptor_UsernameTokenSignature">
<constructor-arg>
<map>
<entry key="action" value="UsernameTokenSignature" />
<entry key="user" value="Admin" />
<entry key="passwordCallbackClass" value="mypackage.ClientCallbackHandler" />
</map>
</constructor-arg>
</bean>
但是,我无法正确设置服务来处理来自此客户端的邮件。我试过了:
服务
<jaxws:endpoint id="soapServ_v3" implementor="#myServiceFacade" address="/MyService_v1">
<jaxws:inInterceptors>
<ref bean="WSS4JInInterceptor_UsernameTokenSignature" />
</jaxws:inInterceptors>
</jaxws:endpoint>
WSS4JInInterceptor
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor" id="WSS4JInInterceptor_UsernameTokenSignature">
<constructor-arg>
<map>
<entry key="action" value="UsernameTokenSignature" />
<entry key="passwordCallbackClass" value="mypackage.ServerCallbackHandler" />
</map>
</constructor-arg>
</bean>
执行此操作时,服务器不接受来自客户端的消息,并以安全错误响应。 调试我发现它失败的第一个地方是org.apache.wss4j.dom.validate.UsernameTokenValidator的verifyUnknownPassword。 这里allowUsernameTokenDerivedKeys设置为false。我认为我可以设置一些配置来实现这一点。
服务器上允许用户名令牌派生密钥的正确配置是什么?
即使我使用调试器将值更改为true,服务调用仍然失败。在这种情况下,拦截器会在checkActions处抛出异常:&#39;发现处理标题的错误&#39;。
所以我认为还有其他我需要配置的东西。 任何人都知道如何正确设置?
答案 0 :(得分:1)
好的,我终于明白了。布尔属性&quot; allowUsernameTokenNoPassword&#39;需要设置为&#39; true&#39;以便服务器接受没有密码的UT。然后另外通过安全标头检查&#39; UsernameTokenNoPassword&#39;需要添加为行动。
工作配置如下所示:
<强> WSS4JInInterceptor:强>
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor" id="WSS4JInInterceptor_UsernameTokenSignature">
<constructor-arg>
<map>
<entry key="action" value="UsernameTokenSignature UsernameTokenNoPassword" />
<entry key="allowUsernameTokenNoPassword" value="true" />
<entry key="passwordCallbackClass" value="mypackage.ServerCallbackHandler" />
</map>
</constructor-arg>
</bean>