我第一次使用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服务询问问题时,都要执行登录。
哪种方法最好?