我在尝试运行Sping Boot 应用程序时遇到问题。错误是与“securityConfig”bean相关的BeanCurrentlyInCreationException。它提到了循环引用,但我无法确定问题的来源。应用程序无法启动,我需要帮助解决此问题。
1.我定义了一个名为“SecurityConfig”的安全配置类。
1.在运行Sping Boot 应用程序时,我遇到以下错误。
1.错误消息提到了BeanCurrentlyInCreationException并引用了“securityConfig”bean。
1.我怀疑可能有一个循环引用,但我有麻烦识别它。
package com.criticine.config;
import com.criticine.repository.UserRepository;
import com.criticine.security.JwtAuthenticationEntryPoint;
import com.criticine.security.JwtAuthenticationFilter;
import com.criticine.service.impl.CustomUserDetailsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(
securedEnabled = true,
jsr250Enabled = true,
prePostEnabled = true)
public class SecurityConfig {
private final CustomUserDetailsServiceImpl customUserDetailsService;
private final JwtAuthenticationEntryPoint unauthorizedHandler;
private final JwtAuthenticationFilter jwtAuthenticationFilter;
@Autowired
public SecurityConfig(UserRepository userRepository, CustomUserDetailsServiceImpl customUserDetailsService,
JwtAuthenticationEntryPoint unauthorizedHandler, JwtAuthenticationFilter jwtAuthenticationFilter) {
this.customUserDetailsService = customUserDetailsService;
this.unauthorizedHandler = unauthorizedHandler;
this.jwtAuthenticationFilter = jwtAuthenticationFilter;
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.csrf(AbstractHttpConfigurer::disable)
.cors(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(request -> {
request.requestMatchers("/api/**").permitAll();
request.requestMatchers("/api/auth/**").permitAll();
request.requestMatchers("/api/users/checkUsernameAvailability", "/api/users/checkEmailAvailability").permitAll();
request.anyRequest().authenticated();
})
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
return http.build();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(customUserDetailsService)
.passwordEncoder(passwordEncoder());
}
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception {
return configuration.getAuthenticationManager();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
个字符
- 我使用的是Sping Boot 版本3.2.0
- 我检查了代码中的循环引用,但没有找到。
- 我尝试重新安排bean创建的顺序,但问题仍然存在。
1条答案
按热度按时间eulz3vhy1#
因为passwordEncoder是在执行configureGlobal方法时示例化的,而此时SecurityConfig也在示例化,所以会导致循环引用。最简单的方法是像下面这样使用static修改passwordEncoder方法。
字符串