Нужно универсальное решение для приложения на базе Spring для любого источника данных при истечении срока действия пароля - PullRequest
0 голосов
/ 13 июня 2018

Я не знаю, как подойти к решению для следующего сценария.

У нас есть новое требование удалить пароль БД из свойств, даже если он зашифрован библиотекой Jasypt или некоторыми другими алгоритмами.

Вместо того, чтобы хранить пароль в свойствах или LDAP, нам нужно получить его динамически из Cyberark .

Срок действия пароля может истечьчерез день или два или через неделю или через месяц.Это полностью зависит от политики истечения срока действия пароля.

У нас есть несколько проектов.Некоторые из них доступны через Интернет, а некоторые - отдельно.Мы хотим написать общее решение.

Как переопределить getConnection метод любого источника данных, такого как Источник данных Spring, источник данных Apache Basic (поддерживает класс расширения), C3P0, DBCP или HikariCP без влияния на их поведение и установки пароля перед нажатием super.getConnection()?

super.getConnection(); // Here max attempt  will be 3

Spring поддерживает замену метода, но я не знаю, как это повлияет на инфраструктуру пула соединений.

Дайте мне знать, если вам нужно больше деталей.

1 Ответ

0 голосов
/ 27 июня 2018

Для решения вашей проблемы вы можете использовать библиотеку spring-cloud-context и ее аннотацию @RefreshScope.Кроме того, вам необходимо немного развить.

1) Вам нужен специальный компонент-наблюдатель, который будет следить за изменением пароля.Это будет что-то вроде этого:

@Service
public class Watcher {
    private final ContextRefresher refresher;

    public Watcher(ContextRefresher refresher) {
        this.refresher = refresher;
    }

    @Scheduled(fixedDelay = 10000L)
    public void monitor() {
        if (/* smth changed*/) {
            refresher.refresh();
        }
    }
}

Итак, когда вы вызываете refresher.refresh();, все бины, отмеченные @RefreshContext, будут удалены и воссозданы после первого доступа к ним.

2) Аннотируйте ваш компонент источника данных с аннотацией @RefreshContext.3) Вы должны предоставить пароль для доступа, используя аннотацию @ConfigurationProperties.Вам нужно будет создать SourceLocator.Это будет что-то вроде этого

@Order(0)
public class SourceLocator implements PropertySourceLocator {
    @Override
    public PropertySource<?> locate(Environment environment) {
        //Load properties to hash map
        return new MapPropertySource("props", new HashMap<>());
    }
}

Также создайте файл spring.factories и поместите туда следующие данные:

org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.test.YourSourceLocator

4) Создать класс свойствгде ваш проход БД будет храниться и обновляться.

@RefreshScope
@ConfigurationProperties(prefix="your.prefix")
public class Properties {
    private String dbPassword;
}

Автоматически связать этот bean-компонент с конфигурацией, в которой вы создаете свой источник данных и используете пароль из него.

...