스프링/스프링 시큐리티

스프링 필터 - 권한 있는 사람만 접근

chanhee01 2024. 1. 8. 17:31

프로젝트에서 로그인 기능을 만들 때 스프링 시큐리티에 대한 깊이 이해가 없었기 때문에 스프링 시큐리티에 대한 공부와 강의 코드를 정리를 할 것이다.

 

나머지 코드들은 아래의 링크에서 확인이 가능하다.

 

깃허브 : chanhee01/spring-security (github.com)

 

 

@Configuration
@EnableWebSecurity // 스프링 시큐리티 필터가 스프링 필터체인에 등록이 된다.
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf(CsrfConfigurer::disable);
        http.authorizeHttpRequests(authorize ->
                authorize
                        .requestMatchers("/user/**").authenticated()
                        .requestMatchers("/manager/**").hasAnyRole("ADMIN", "MANAGER")
                        .requestMatchers("/admin/**").hasAnyRole("ADMIN")

                        .anyRequest().permitAll()
        );
        http.formLogin(formLogin -> formLogin
                .loginPage("/loginForm"));

        return http.build();
    }
}

config 패키지에 있는 SecurityConfig 파일을 만들어준다.

 

스프링 빈으로 등록된 SecurityFilterChain은 특정 사용자만 입력할 수 있도록 해주는 Configuration이다.

 

authrozie를 통해서 /user로 시작하는 path는 모두가 접근할 수 있고, /manager, /admin으로 시작하는 path는 각각 ADMIN, MANGER와 ADMIN이라는 Role을 가진 사용자만 접근할 수 있다.

 

http.formLogin은 권한이 없는 사용자가 접근을 하면 /loginForm 페이지로 다시 보내는 것이다.

 

anyRequest.permitAll()은 나머지 path는 모두 접근할 수 있다는 것이다.

 

localhost:8080은 스프링 필터체인에 걸리지 않기 때문에 로그인을 안해도 들어갈 수 있다.

 

 

localhost:8080/user로 접근하면 로그인을 안했기 때문에 403 에러가 발생한다.

admin과 manager의 경로로 접근한다고 할 때에도 위와 같은 403 에러가 발생한다.