Реализация резервного варианта в случае сбоя подключения к базе данных ⇐ JAVA
-
Anonymous
Реализация резервного варианта в случае сбоя подключения к базе данных
Я баловался Spring и столкнулся с множеством проблем. Проблема, которую я сейчас пытаюсь решить, касается условного запуска компонента.
У меня есть защищенное приложение Spring. Используя Spring Security 6, мне удалось успешно реализовать авторизацию и ролевой доступ к различным страницам моего приложения. Более того, мне удалось подключить его к базе данных MySQL и получить оттуда учетные данные.
Сейчас я пытаюсь создать «аварийный» режим, чтобы при необходимости он мог работать без базы данных. Логика такая: если он может подключиться к базе данных, то он получает данные о пользователе оттуда. Если это невозможно, он возвращается к настройкам Spring Security по умолчанию (случайно сгенерированный пароль, который сохраняется в журнале).
В настоящее время без подключения он просто не запускается (что, конечно, ожидаемо).
Конфигурация безопасности, если необходимо (она очень общая):
@Configuration @EnableWebSecurity общественный класс WebSecurityConfig { @Бин public SecurityFilterChain securityFilterChain(HttpSecurity http) выдает исключение { http .authorizeHttpRequests((запросы) -> запросы .requestMatchers("/").hasRole("admin") .requestMatchers("/view").authenticated() ) .formLogin((форма) -> форма .permitAll() ) .logout((выход) -> logout.permitAll()); вернуть http.build(); } @Бин общественный PasswordEncoder getPasswordEncoder () { вернуть новый BCryptPasswordEncoder(); } @Услуга публичный класс CustomDetails реализует UserDetailsService { @Autowired частный UserRepository userRepository; @Override public UserDetails loadUserByUsername (String username) { securingweb.User пользователь = userRepository.findByUsername(имя пользователя); если (пользователь == ноль) { выбросить новое UsernameNotFoundException (имя пользователя); } вернуть новый UserPrincipal(пользователь); } } } Мне удалось найти этот фрагмент кода, который позволяет определить успешность подключения к БД:
@Component общественный класс DBCheck { public DBCheck(DataSource dataSource) выдает SQLException { log.info("Подключение к базе данных действительно = {}", dataSource.getConnection().isValid(1000)); } } И это действительно так. Я добавил его в свой основной класс, и, похоже, он запускается раньше других компонентов. Теперь, если я правильно понимаю, мне нужно сделать это Соединение. И установите указанное условие на мои bean-компоненты, чтобы начать зависеть от него.
И здесь для меня все сложнее. Я не смог хорошо понять Connection. Так как мне это сделать? Это пользовательское Соединение? Если да, нужно ли мне что-то делать с предоставленными ему полями контекста и метаданных? Или они обрабатываются магией Spring? Или я все делаю неправильно? Я очень запутался.
Я баловался Spring и столкнулся с множеством проблем. Проблема, которую я сейчас пытаюсь решить, касается условного запуска компонента.
У меня есть защищенное приложение Spring. Используя Spring Security 6, мне удалось успешно реализовать авторизацию и ролевой доступ к различным страницам моего приложения. Более того, мне удалось подключить его к базе данных MySQL и получить оттуда учетные данные.
Сейчас я пытаюсь создать «аварийный» режим, чтобы при необходимости он мог работать без базы данных. Логика такая: если он может подключиться к базе данных, то он получает данные о пользователе оттуда. Если это невозможно, он возвращается к настройкам Spring Security по умолчанию (случайно сгенерированный пароль, который сохраняется в журнале).
В настоящее время без подключения он просто не запускается (что, конечно, ожидаемо).
Конфигурация безопасности, если необходимо (она очень общая):
@Configuration @EnableWebSecurity общественный класс WebSecurityConfig { @Бин public SecurityFilterChain securityFilterChain(HttpSecurity http) выдает исключение { http .authorizeHttpRequests((запросы) -> запросы .requestMatchers("/").hasRole("admin") .requestMatchers("/view").authenticated() ) .formLogin((форма) -> форма .permitAll() ) .logout((выход) -> logout.permitAll()); вернуть http.build(); } @Бин общественный PasswordEncoder getPasswordEncoder () { вернуть новый BCryptPasswordEncoder(); } @Услуга публичный класс CustomDetails реализует UserDetailsService { @Autowired частный UserRepository userRepository; @Override public UserDetails loadUserByUsername (String username) { securingweb.User пользователь = userRepository.findByUsername(имя пользователя); если (пользователь == ноль) { выбросить новое UsernameNotFoundException (имя пользователя); } вернуть новый UserPrincipal(пользователь); } } } Мне удалось найти этот фрагмент кода, который позволяет определить успешность подключения к БД:
@Component общественный класс DBCheck { public DBCheck(DataSource dataSource) выдает SQLException { log.info("Подключение к базе данных действительно = {}", dataSource.getConnection().isValid(1000)); } } И это действительно так. Я добавил его в свой основной класс, и, похоже, он запускается раньше других компонентов. Теперь, если я правильно понимаю, мне нужно сделать это Соединение. И установите указанное условие на мои bean-компоненты, чтобы начать зависеть от него.
И здесь для меня все сложнее. Я не смог хорошо понять Connection. Так как мне это сделать? Это пользовательское Соединение? Если да, нужно ли мне что-то делать с предоставленными ему полями контекста и метаданных? Или они обрабатываются магией Spring? Или я все делаю неправильно? Я очень запутался.
Мобильная версия