数据库连接失败时实施回退

问题描述 投票:0回答:1

我一直在涉足Spring,一路上遇到了很多问题。我当前尝试解决的问题是有关条件 bean 启动的问题。

我有一个安全的 Spring 应用程序。使用 Spring Security 6,我能够成功地实现对应用程序不同页面的授权和基于角色的访问。更重要的是,我能够将它与 MySQL 数据库连接并从那里获取凭据。

我现在想做的是设置一个“紧急”模式,使其在需要时无需数据库即可运行。逻辑是这样的:如果它可以连接到数据库,那么它就会从那里获取用户详细信息。如果不能,它会回退到 Spring Security 默认值(随机生成的密码,并放入日志中)。

目前,如果没有连接,它就无法启动(当然,这是预期的行为)。

如果需要的话安全配置(非常通用):

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((requests) -> requests
                .requestMatchers("/").hasRole("admin")
                .requestMatchers("/view").authenticated()
            )
            .formLogin((form) -> form
                .permitAll()
            )
            .logout((logout) -> logout.permitAll());
        return http.build();
    }

    @Bean
    public PasswordEncoder getPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }
    
    @Service
    public class CustomDetails implements UserDetailsService {

        @Autowired
        private UserRepository userRepository;

        @Override
        public UserDetails loadUserByUsername(String username) {
            securingweb.User user = userRepository.findByUsername(username);
            if (user == null) {
                throw new UsernameNotFoundException(username);
            }
            return new UserPrincipal(user);
        }
    }
}

我能够找到这段代码,可以检测数据库连接是否成功:

@Component
public class DBCheck {
    public DBCheck(DataSource dataSource) throws SQLException {
        log.info("Database connection valid = {}",dataSource.getConnection().isValid(1000));
    }
}

确实如此。我将它添加到我的主类中,它似乎在任何其他 bean 之前开始。现在,如果我理解正确的话,我需要将其设为

Connection
。并在我的豆子上安装所述条件以根据它开始。

这对我来说变得复杂。我不太能理解

Connection
。那我该怎么办呢?这是定制的吗
Connection
?如果是,我是否需要对提供给它的上下文和元数据字段执行某些操作?或者它们是由 Spring magic 处理的?还是我做的都是错的?我很困惑。

java spring jdbc spring-security
1个回答
0
投票

您将从数据源中获得

Connection
。数据源是由应用程序服务器配置的资源。它配置一个连接池。有几个库可以实现这一点。您可以在这里找到其中一些。

© www.soinside.com 2019 - 2024. All rights reserved.