Я получил это решение после отладки внутренней части Springboot:
создал CustomUserNameTokenAction :
@Getter
@Setter
@AllArgsConstructor
public class CustomUserNameTokenAction implements Action {
private String userName;
private String password = "";
public void execute(WSHandler handler, SecurityActionToken actionToken,
Document doc, RequestData reqData)
throws WSSecurityException {
String username = userName;
WSSecUsernameToken builder = new WSSecUsernameToken();
builder.setIdAllocator(reqData.getWssConfig().getIdAllocator());
builder.setPrecisionInMilliSeconds(reqData.isPrecisionInMilliSeconds());
builder.setWsTimeSource(reqData.getWssConfig().getCurrentTime());
builder.setPasswordType(WSConstants.PASSWORD_TEXT);
builder.setPasswordsAreEncoded(reqData.isEncodePasswords());
builder.setUserInfo(username, password);
builder.build(doc, reqData.getSecHeader());
}
}
Я также создал класс для переноса конфигурацииимя пользователя и пароль
@Getter
@Setter
public class UserNameTokenConfig {
private String userName;
private String password;
}
Мой код для перехватчика безопасности:
@Bean
public Wss4jSecurityInterceptor securityInterceptor() throws Exception {
Wss4jSecurityInterceptor securityInterceptor = new Wss4jSecurityInterceptor();
CryptoFactoryBean crypto = new CryptoFactoryBean();
crypto.setKeyStoreLocation(getResourceFrom(keyStoreLocation));
crypto.setKeyStorePassword(keyStorePassword);
crypto.setKeyStoreType("JKS");
crypto.afterPropertiesSet();
securityInterceptor.setSecurementActions(WSHandlerConstants.SIGNATURE + " " + WSHandlerConstants.TIMESTAMP + " " + WSHandlerConstants.USERNAME_TOKEN);
securityInterceptor.setSecurementSignatureKeyIdentifier("DirectReference");
securityInterceptor.setSecurementSignatureCrypto(crypto.getObject());
securityInterceptor.setSecurementUsername(keyAlias);
securityInterceptor.setSecurementPassword(keyPassword);
val wssConfig = WSSConfig.getNewInstance();
wssConfig.setAction(1, new CustomUserNameTokenAction(userNameToken.getUserName(), userNameToken.getPassword()));
securityInterceptor.setWssConfig(wssConfig);
return securityInterceptor;
}
, поэтому
securityInterceptor.setSecurementUsername(keyAlias);
securityInterceptor.setSecurementPassword(keyPassword);
используются для WSHandlerConstants.SIGNATURE
и
val wssConfig = WSSConfig.getNewInstance();
wssConfig.setAction(1, new CustomUserNameTokenAction(userNameToken.getUserName(), userNameToken.getPassword()));
securityInterceptor.setWssConfig(wssConfig);
используется для WSHandlerConstants.USERNAME_TOKEN
надеюсь, это поможет