spring-ws: Wss4jSecurityInterceptor UserNameToken вместе с подписью securityActions - PullRequest
0 голосов
/ 05 октября 2018

Использование Wss4jSecurityInterceptor для добавления userNameToken и Signature securementActions не работает, потому что BinarySecurityToken и UsernameToken берет один и тот же пароль и userName из 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;
}

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

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

1 Ответ

0 голосов
/ 15 октября 2018

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

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

...