본문 바로가기

코딩/예외 창고

SpringBoot DI, @Configuration 에서 주의할 점. Error creating bean with name 'jwtAuthenticationFilter': Requested bean is currently in creation: Is there an unresolvable circular reference?

package pnu.problemsolver.myorder.config;

import io.jsonwebtoken.Jwt;
import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.configuration.WebSecurityConfiguration;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.web.filter.OncePerRequestFilter;
import pnu.problemsolver.myorder.filter.JwtAuthenticationFilter;
import pnu.problemsolver.myorder.security.JwtTokenProvider;

import javax.servlet.Filter;
import javax.servlet.http.HttpSession;

@Configuration
@EnableWebSecurity //기본적인 웹보안을 활성화
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final ApplicationContext applicationContext;
//    private final JwtAuthenticationFilter jwtAuthenticationFilter; 이렇게 DI받으려했다.
//클래스에서 생성하는데 이 클래스에서 DI받지는 못하는 듯. 

    @Bean
    //암호화 객체
    PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    JwtAuthenticationFilter jwtAuthenticationFilter() {
        return new JwtAuthenticationFilter((JwtTokenProvider) applicationContext.getBean("jwtTokenProvider"));
    }


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //빌더패턴을 사용함.
        http
                .httpBasic().disable()//기본 로그인 페이지 사용x
                .csrf().disable()   //REST API 사용하기 때문에 csrf x
                .authorizeRequests()
                .antMatchers("/store/list").permitAll()//가게 보여주는 것은 permit all
                .antMatchers("**").hasRole("USER")           //USER 접근 가능
//                .antMatchers("/admin/**").hasRole("ADMIN")     //ADMIN만 접근 가능
                .anyRequest().authenticated()   //나머지 요청들은 권한이 있어야만 접근 가능
                .and()
                .formLogin()
                .loginPage("/members/login")    //로그인 페이지
                .defaultSuccessUrl("/store/list") //로그인 성공 후
                .and()
                .logout()
                .logoutSuccessUrl("/members/login")//로그아웃 성공
                .and()
                .exceptionHandling()
                .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); //jwt사용을 위해 session해제

        //필터등록.
        http.addFilterBefore((OncePerRequestFilter) applicationContext.getBean("jwtAuthenticationFilter"), UsernamePasswordAuthenticationFilter.class);
//        http.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);//이렇게는 안된다. 이 클래스에서 주입받을 때 이렇게
//사용하지는 못하는 듯.

     
    }


}

Configuration클래스 SecurityConfig.java에서 클래스 JwtAuthenticationFilter 에 대한 빈을 생성할 때 BJwtAuthenticationFilter 를 SecurityConfig.java 에서 DI받지는 못한다.

 

오류내용은 아래와 같다. circular reference?라는 점을 보아 순환참조임을 알 수 있다.

 

Error creating bean with name 'jwtAuthenticationFilter': Requested bean is currently in creation: Is there an unresolvable circular reference?