我一直在涉足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 处理的?还是我做的都是错的?我很困惑。