在Web服务中执行SOAP身份验证的最佳方法是什么?

时间:2019-02-13 13:50:26

标签: java xml web-services soap

我第一次使用Spring Boot,Java 8和Spring WS Security用SOAP编写Web服务。
在使用SOAP之前,我曾经编写过我经常发送的REST服务,用于通过HTTPS以纯文本形式执行登录名,用户名和密码。
但是我无法找到一个很好的选择来编写符合SOAP使用消耗登录操作的最佳实践的登录方法。
到目前为止,这是我尝试过的操作:登录操作具有自己专用的EndPoint

@Endpoint
public class UserLoginEndpoint {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    public static final String NAMESPACE= "some.fancy.ws";

    @Autowired
    UserService userService;


    @Autowired
    private AuthUtility authUtil;


    @PayloadRoot(namespace = NAMESPACE, localPart = "loginRequest")
    @ResponsePayload
    public LoginResponse executeLoginRequest(@RequestPayload LoginRequest request)  {
        logger.info("Received webservice call for executeLoginRequest");
        LoginResponse response = new LoginResponse();
        String username = request.getUsername();
        String password = request.getPassword();
        List<VnWsCredential> storedCredentials = authUtil.getStoredCredentials(username, password);
        if (storedCredentials.size()>0) {
            response.setAccessToken(authUtil.generateToken(storedCredentials.get(0)));
            response.setStatusCode(200);
            response.setSuccess(true);
            response.setMessage("Login effettuato con successo");
        }else {
            response.setAccessToken("");
            response.setStatusCode(500);
            response.setSuccess(false);
            response.setMessage("Invalid credentials");
        }
        return response;
    }
}

这是XSD的一部分,用于定义LoginResponse对象

<xs:element name="loginResponse">
<xs:complexType>
    <xs:sequence>
        <xs:element name="statusCode" type="xs:int"/>
        <xs:element name="success" type="xs:boolean"/>
        <xs:element name="message" type="xs:string" />
        <xs:element name="accessToken" type="xs:string" />
    </xs:sequence>
</xs:complexType>

如您所见,这是非常面向REST的(由于我的经验)。
我还看到Apache制造了一个安全拦截器,它也可以解决这个问题,但是我似乎找不到如何使之工作的方法

@Bean
public Wss4jSecurityInterceptor securityInterceptor(){
    Wss4jSecurityInterceptor securityInterceptor = new Wss4jSecurityInterceptor();
    securityInterceptor.setValidationActions("UsernameToken");
    securityInterceptor.setValidationCallbackHandler(authorizationCallBackHandler());
    return securityInterceptor;
}

我还听说可以通过“ UsernameToken”进行身份验证,但是我已经发现这不是一种常见的做法(至少从我所看到/听到的情况来看),最后但不是至少,每次需要向Web服务询问问题时,都要执行登录。
哪种方法最好?

0 个答案:

没有答案