Каков наилучший способ выполнить аутентификацию SOAP в веб-сервисе? - PullRequest
0 голосов
/ 13 февраля 2019

Я впервые пишу веб-сервис в SOAP с использованием Spring Boot, Java 8 и Spring WS Security.
До SOAP я писал сервисы REST, в которые я всегда отправлял, для выполнения входа в систему., имя пользователя и пароль в виде открытого текста по HTTPS.
Но мне не удается найти хороший вариант для написания метода входа в систему, который соответствует рекомендациям SOAP по использованию действия входа в систему.
Вот что я пробовал до сих пор: действие входа в систему имеет свою собственную выделенную конечную точку

@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 Security Interceptor, который также должен делать свое дело, но я не могу понять, как заставить его работать

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

Я также слышал, что аутентификация можетсделать через " UsernameToken ", но я видел, что это не обычная практика (по крайней мере, из того, что я видел / слышал), и, наконец, но не в последнюю очередь, вход в систему каждый раз, когда янужно что-то спросить в веб-сервисах.
Какой может быть лучший подход?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...