Filter 추가하기

장서연·2022년 4월 1일
0

스프링 시큐리티

목록 보기
1/9

implements Filter 를 하면, 필터가 된다.

public class MyFilter1 implements Filter {
	
    @Override
    public void doFilter(ServletRequest, ServletResponse, FilterChain chain)
    	throws IOException, ServletException {
        System.out.println("필터");
        chain.doFilter(request, response);
        
        }
}

만약 이걸 시큐리티 필터에 등록하고 싶다면, 이렇게 해주는 것으로만은 의미가 없다. 필터에 따로 등록을 해주어야함.

  • 시큐리티 필터나,
  • 그냥 필터에

1. 시큐리티 필터에 등록하는 법

@Configuration
@EnableWebSecurity // 시큐리티 활성화
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter { // <- 시큐리티 필터!

    private final CorsFilter corsFilter; // 앞서 빈으로 등록하였었음. 주입받자. 스프링의 CorsFilter 를 커스텀하게 설정한 필터. "모든 요청"은 이 필터를 탄다.


    // Authentication (권한 관련)
    @Override // 이 서버는 stateless 서버이며, 크로스 오리진 요청을 허용한다. 즉 모든 요청을 허용한다. 폼 로그인도 쓰지 않음.
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) // "이 서버는 stateless 서버야!!!"세션을 만들지 않겠다는 뜻. STATELESS 서버
                .and()
                .addFilterBefore(new FooFilter1(), BasicAuthenticationFilter.class)
                .addFilter(corsFilter) // 이 필터가 잘 동작하는지의 여부는 자바스크립트로 여기로 요청을 보내보면 알 수 있다. @CrossOrigin (인증없어도 되는데서만 동작. 인증이 필요한 경로 요청시 먹지 않음. 인증이 필요한 크로스 오리진 요청시에는 반드시 "시큐리티필터"에 크로스 오리진 설정을 해주어야 한다.
                .formLogin().disable() // 폼 로그인 안씀
                .httpBasic().disable() // httpBasic 말고 Bearer 쓸거임
                .authorizeRequests() // 권한이 있어야 하는 요청들
                /**
                 * USER 나 ADMIN 등 권한 없이 그냥 접근시 403상태코드(Forbidden, 권한없음) 을 내려줌!
                 */
                .antMatchers("/api/v1/user/**")
                .access("hasRole('ROLE_USER') or hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
                .antMatchers("/api/v1/manager/**")
                .access("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
                .antMatchers("/api/v1/admin/**")
                .access("hasRole('ROLE_ADMIN')")

                .anyRequest().permitAll(); // 그 외의 다른 요청은 전부 권한 없이 들어갈 수 있다!
        /**
         * 기본적인 http 로그인방식으로 쓰지 않으며,
         * 세션도 만들지 않는다.
         *
         * jwt 서버니까~
         */
    }
}

2. 일반 필터에 등록하는 법

클래스 하나 생성해서 @Configuration 하여 메모리에 뜨도록 하자. 그리고, FilterRegistrationBean 으로 필터에 빈으로 등록하여 빈으로 뜨게 하면, 일반 필터에 적용된다.

@Configuration
public class CommonFilterConfig {
    @Bean
    FilterRegistrationBean<FooFilter1> fooFilter1(){
        FilterRegistrationBean<FooFilter1> fooBean = new FilterRegistrationBean<>(new FooFilter1());
        fooBean.addUrlPatterns("/foo/*"); // /foo/* 요청에 대해 Foo 필터 적용
        fooBean.setOrder(0); // 필터의 순서를 정할 수 있는데, 낮은 번호일수록 필터중에서 가장 먼저 실행된다.
        return fooBean;
    }

    @Bean
    FilterRegistrationBean<BarFilter1> barFilter1(){
        FilterRegistrationBean<BarFilter1> barBean = new FilterRegistrationBean<>(new BarFilter1());
        barBean.addUrlPatterns("/bar/*"); // /bar/* 요청에 대해 Bar 필터 적용
        barBean.setOrder(1); // 무조건 Foo 필터 이후에 실행됨
        return barBean;
    }
}

0개의 댓글