글에서 틀린부분이 있다면 지적해주시면 감사하겠습니다. 빠른 수정을 통해 잘못된 정보가 퍼지는 것을 막는걸 도와주세요.
우선 글을 시작하기에 앞서 본 포스팅은 https://colabear754.tistory.com/171 을 참고하여 공부하면서 겪은 문제들을 적어 놓은 글입니다. 자세한 내용은 해당 링크를 참조바랍니다.
시작은 단순히 교육에서 배운 내용을 복기하고자 혼자서 토이 프로젝트를 하려고 했다. 그 과정에서 개발자가 되었을 때 최신기술에 누구보다 익숙해져있자라는 마인드로 스프링부트 최신버전, 시큐리티 최신버전을 선택했다가 고생을 좀 했다.
api별 접근 권한을 확인하기 위해서 사용한 커스텀 어노테이션이 동작하지 않을 때
권한에 따라 api의 호출을 제한하기 위해서 위 글에서는 @PreAuthorize 를 사용하였다. 이 때 내 프로젝트에서는 해당 어노테이션 및 커스텀 어노테이션을 적용하던 말던 그냥 api가 바로 호출되는 현상이 발생했었는데 이 문제는 SecurityConfig파일에 @EnableGlobalMethodSecurity(prePostEnabled = true) 를 적용하여서 해결했다. 하지만 해당 어노테이션은 곧 지원이 종료되기에 다른 방법을 적용해야했는데 그 때 @EnableMethodSecurity을 적용해주어 해결하였다.
시큐리티 컨피그 파일 형식
이건 문제라면 문제일 수도 있는데 기존에는 아래와 같이 csrf().disalbe(), sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) 와 같이 설정한 친구들이 버전업이 되면서 인텔리제이에서 지원 안되니깐 빨리 바꿔라 라고 계속 에러문구가 떴다.
// 해당 코드는 포스팅 상단에 위치한 글 또는 프로젝트와는 전혀 상관없는 코드입니다. (참고용)
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http)
throws Exception {
http
.csrf()
.disable()
.cors().and()
.authorizeHttpRequests()
.requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
.requestMatchers(
"/swagger-ui/**"
, "/swagger-ui.html"
, "/swagger-resources/**"
, "/v3/api-docs/**"
).permitAll()
.requestMatchers(
...
).permitAll()
.requestMatchers(
...
).hasRole(Role.ADMIN.toString())
.anyRequest().authenticated()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authenticationProvider(authenticationProvider)
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
return http.build();
사실 무시하고 진행해도 상관은 없는데 빨간줄 뜨는게 신경쓰여서 찾아보니 람다 형식으로 바꿔서 작성하는 것을 추천한다라고 되어있었다. 이유는 csrf() 와 같이 기본 함수는 더 이상 지원을 하지 않고 커스텀한 함수들을 사용하라는 것 같았다.
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
@RequiredArgsConstructor
public class SecurityConfig {
private final String[] allowedUrls = {"/health-check/**", // 정상적인 통신을 확인하는 테스트 api
"/swagger-ui/**", "/swagger-resources/**", "/swagger-ui.html", "/v3/api-docs/**", // swagger-ui
"/auth/**"}; // 로그인, 로그아웃
private final TokenAuthenticationFilter tokenFilter;
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.cors(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(request -> request
.requestMatchers(allowedUrls).permitAll()
.anyRequest().authenticated())
.sessionManagement(session ->
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.addFilterBefore(tokenFilter, BasicAuthenticationFilter.class);
return http.build();
}
그래서 위와 같이 disable 설정을 해주면 되고 추가로 requestMatcher 도 설정법이 바뀌었으니 참고하시면 좋을 거 같습니다.
'코딩 공부 > SpringBoot' 카테고리의 다른 글
마이바티스 The column index is out of range (0) | 2023.09.21 |
---|---|
인텔리제이 스프링부트 실행 오류 - 환경 변수 주입 안되는 오류 (0) | 2023.09.20 |
application.yml 외부 환경 변수 사용 (0) | 2023.06.24 |
TDD - 테스트 주도 개발 (0) | 2022.12.26 |
스프링 웹 개발 기초 (0) | 2022.12.12 |