Java Spring Webservices SOAP身份验证

时间:2018-02-14 21:49:45

标签: java spring authentication soap wsdl

我正在使用java spring webservice将soap请求发送到服务器。但是我收到来自服务器的错误

The security context token is expired or is not valid

然后我将身份验证添加到SOAP头,导致请求xml像这样:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
   <env:Header>
      <Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
         <UsernameToken>
            <Username>XXXXXXXX</Username>
            <Password>XXXXXXXX</Password>
         </UsernameToken>
      </Security>
   </env:Header>
   <env:Body>
      The body is in the correct format here
   </env:Body>
</env:Envelope>

但我仍然得到那个错误。根据我的理解,客户端将身份验证凭据发送到服务器,服务器发送回requestToken,用于保持客户端和服务器之间的连接,然后客户端使用从服务器收到的令牌可以进行任何其他API调用,如登录,买,卖(或API中提到的任何东西)

我在这个假设中是对的吗?如果是,那么如何使用Java Spring WebServices实现这一点。我是否需要在客户端生成字段,如BinarySecret,并在RequestSecurityContext下打包?

为了添加SOAP头,我编写了一个实现WebServiceMessageCallback的类,并覆盖了doWithMessage方法,并在其中为用户名和密码(即安全性)写入标题

任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:0)

因此,经过2天的发现,我能够找到解决方案!

1)使用CXF wsdl2java

从wsdl生成类

2)确保在pom文件中指向正确的wsdlLocation

3)从生成的服务类中获取存根并注入提供的用户名和密码,然后它应该工作。像这样:

TEST VECTOR : 
[ 1 2 ]
ELEM : 
1
BASE VECTOR : 
[ 2 ]
ROOT CASE , RET PERM : 
[
[ 2 ]
]
PROCESS PERMS : 
[
[ 2 ]
]
V_i : 
[ 2 ]
k : 0
ORG PERM : 
[ 2 ]
PUSH PERM : 
[ 1 2 ]
RET PERMS : 
[
[ 1 2 ]
]
CLEANED PERM : 
[ 2 ]
k : 1
ORG PERM : 
[ 2 ]
PUSH PERM : 
[ 2 1 ]
RET PERMS : 
[
[ ]
[ 2 1 ]
]
CLEANED PERM : 
[ 2 ]
double free or corruption (out)

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