Spring Security Sping Boot 应用程序启动期间出错:安全配置中出现BeanCurrentlyInCreationException

ki0zmccv  于 5个月前  发布在  Spring
关注(0)|答案(1)|浏览(62)

我在尝试运行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创建的顺序,但问题仍然存在。
eulz3vhy

eulz3vhy1#

因为passwordEncoder是在执行configureGlobal方法时示例化的,而此时SecurityConfig也在示例化,所以会导致循环引用。最简单的方法是像下面这样使用static修改passwordEncoder方法。

@Bean
    public static PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

字符串

相关问题