Есть ли способ обновить/изменить пароль соединения MongoDB во время выполнения?

Запрос состоит в том, чтобы изменить пароль соединения mongodb во время выполнения в проекте весенней загрузки. Например, предположим, что соединение mongodb установлено при запуске приложения с паролем «xyz». Я хотел бы изменить пароль во время выполнения, скажем, нажав API. До сих пор я пробовал следующие решения для решения этой проблемы:

  • Замена bean-компонента mongoTemplate во время выполнения. Попытка создать новый bean-компонент mongoTemplate с новым паролем во время выполнения и заменить его в контексте, используя методы, указанные ниже ссылка. Проблема с этим подходом заключается в том, что компонент обновляется только один раз. В идеале он должен работать каждый раз, когда вызывается API для обновления пароля.
  • Обновление пароля в mongoCredentials. Один из очевидных подходов — обновить пароль непосредственно в mongoCredentials, поскольку mongoTemplate использует класс mongoCredential для хранения информации об учетных данных. Но проблема в том, что поле пароля в классе MongoCredentials равно '< em>final static», поэтому мы не можем обновить его даже с помощью отражений. Несмотря на то, что есть некоторые хитрости для обновления финальных статических полей, я ищу более приемлемое решение.

person Vinay Singh    schedule 30.05.2021    source источник


Ответы (1)


В проекте Spring Cloud есть @RefreshScope именно для вашей цели. Вот документация Spring о том, как это работает: https://cloud.spring.io/spring-cloud-static/spring-cloud.html#_refresh_scope.

Так что все, что вам нужно сделать, это обновить Environment и вызвать org.springframework.cloud.context.scope.refresh.RefreshScope#refresh или org.springframework.cloud.context.scope.refresh.RefreshScope#refreshAll, когда вам нужно обновить свой контекст.

person geobreze    schedule 30.05.2021
comment
Это отличное решение. Но в моем конкретном случае я создаю bean-компонент mongoTemplate во время выполнения через BeanDefinitionRegistry, поэтому я не могу напрямую добавить аннотацию @RefreshScope. Есть ли способ аннотировать динамический компонент аннотацией RefreshScope? - person Vinay Singh; 01.06.2021
comment
Вы должны установить значение области refresh для вашего определения компонента. - person geobreze; 02.06.2021
comment
Я смог создать bean-компоненты с областью обновления. Только одна проблема. В случае аннотированных методов @RefreshScope, @Bean после вызова метода refresh(beanName) новый компонент будет создан и зарегистрирован в контексте с обновленными конфигурациями. Но в моем случае, как я уже говорил ранее, я динамически генерирую bean-компоненты через beanRegistry. После вызова метода refresh(beanName) новый бин не генерируется, т.е. поток не поступает в postProcessBeanDefinitionRegistry. Любые идеи? - person Vinay Singh; 02.06.2021
comment
@RefreshScope управляется org.springframework.cloud.context.scope.refresh.RefreshScope, который также является BeanDefinitionRegistryPostProcessor с заказом Ordered.LOWEST_PRECEDENCE - 100. Попробуйте запустить постпроцессор перед этим. Теперь я просто догадываюсь, но это может сработать - person geobreze; 02.06.2021