프로젝트/Ku:room

SecurityConfig 내 이용한 허용 URI Enum 클래스로 관리하기

개발하는 민우 2025. 2. 13. 01:00

왜 리팩토링 하였는가?

현재 프로젝트 내에서 스프링 시큐리티를 적용중이다.

특정 URI를 특정 ROLE을 가진 유저가 허용하려면, SecurityConfig 내에서 URI를 열거식으로 나열해야 한다.

이 때, 관리하기 어려움이 있다. 따라서 Enum 클래스로 분리하여 리팩터링 하였다.

스프링 시큐리티 설정을 할 수 있는 SecurityConfig 클래스 내에서 특정 URI를 허용하기 위해 다음과 같이 Enum 클래스로 리팩토링을 진행하였다.

 

@SecurityConfig 클래스

http.authorizeHttpRequests 내에서, AuthorizationList.LIST.getAuthroities()를 이용하여, 권한 설정을 관리하였다.

@EnableWebSecurity
@Configuration
@RequiredArgsConstructor
public class SecurityConfig {
    private final JwtTokenProvider jwtTokenProvider;
    private final RedisUtil redisUtil;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf(AbstractHttpConfigurer::disable);
        http.formLogin(AbstractHttpConfigurer::disable);
        http.httpBasic(AbstractHttpConfigurer::disable);
        http.authorizeHttpRequests((auth) -> auth
                .requestMatchers(AuthorizationList.LIST.getAuthorities()).permitAll()
                .anyRequest().authenticated());
        http.addFilterBefore(new JwtTokenAuthenticationFilter(jwtTokenProvider, redisUtil), UsernamePasswordAuthenticationFilter.class);
        http.sessionManagement((session) -> session
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS));
        return http.build();
    }

 

AuthorizationList Enum 클래스

Collections.unmodifiableList()을 통해 대상이 불변 리스트인걸 보장하였고, getAuthorities() 메서드를 통해 리스트의 대상을 반환하였다.

@Getter
public enum AuthorizationList {
    LIST(Collections.unmodifiableList(Arrays.asList(
            "/api/v1/auth/login",
            "/api/v1/users",
            "/docs/**",
            "/api/v1/users/validations/loginId",
            "/api/v1/users/weinlogin",
            "/api/v1/users/join",
            "/api/v1/mails/auth-codes",
            "/api/v1/mails/verification_codes"
    )));

    private final List<String> authorities;

    AuthorizationList(List<String> authorities) {
        this.authorities = authorities;
    }

    public String[] getAuthorities() {
        return authorities.toArray(new String[0]);
    }
}