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