spring-ws : Wss4jSecurityInterceptor UserNameToken вместе с Signature securityActions

Использование Wss4jSecurityInterceptor для добавления userNameToken и Signature securityActions не работает, поскольку BinarySecurityToken и UsernameToken берут один и тот же пароль и имя пользователя из securityInterceptor.

@Bean
public Wss4jSecurityInterceptor securityInterceptor() throws Exception {
    Wss4jSecurityInterceptor securityInterceptor = new Wss4jSecurityInterceptor();

    CryptoFactoryBean crypto = new CryptoFactoryBean();
    crypto.setKeyStoreLocation(getResourceFrom(keyStoreLocation));
    crypto.setKeyStorePassword(encryptorService.decrypt(keyStorePassword));
    crypto.setKeyStoreType("JKS");
    crypto.afterPropertiesSet();

    securityInterceptor.setSecurementActions(WSHandlerConstants.SIGNATURE + " " + WSHandlerConstants.TIMESTAMP + " " + WSHandlerConstants.USERNAME_TOKEN);
    securityInterceptor.setSecurementSignatureKeyIdentifier("DirectReference");
    securityInterceptor.setSecurementSignatureCrypto(crypto.getObject());
    securityInterceptor.setSecurementUsername(userName);
    securityInterceptor.setSecurementPassword(encryptorService.decrypt(password));

    return securityInterceptor;
}

если имя пользователя и пароль одинаковы для обоих, то это работает, как я могу установить другой пароль пользователя.

это было возможно до использования: securityCallbackHandlers, но с версией wpring-ws 2.4.2 это больше невозможно


person Cedric Dumont    schedule 05.10.2018    source источник


Ответы (1)


Я пришел к этому решению после отладки внутренней части 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;
    }

so

       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

надеюсь, это поможет

person Cedric Dumont    schedule 15.10.2018