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?