티스토리 뷰

들어가며

  • Spring Secutiry를 사용하면서 Custom Filter 를 만들고 Cofiguration에 추가를 해주었는데 아래와 같은 에러가 발생하였다.
    • 사실 해결방법은 메시지에 있긴 하다 ..
    • 그렇지만 원인을 알고 싶었기에
Caused by: java.lang.IllegalArgumentException: 
	The Filter class JwtAuthenticationFilter does not have a registered order and cannot be added without a specified order. 
Consider using addFilterBefore or addFilterAfter instead.

원인

  • 필자의 경우에는 GenericFilterBean을 확장하여 Custom Filter를 정의하고 Security Config에 추가 해줬다.
public class JwtAuthenticationFilter extends GenericFilterBean {
	// 생략 .. 
}

public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        Filter authenticationFilter = new JwtAuthenticationFilter();

        http
                .csrf().disable()
                .addFilter(authenticationFilter);
     }
}

 

  • 문제는 addFilter() 이다. 
  • Document를 보면 아주 명확하게 쓰여 있다.
addFilter() 메서드를 사용하기 위해서는 반드시 Spring Security Framework 에서 제공되는 필터 혹은 이를 확장한 객체이어야 한다.

 

  • 참고로 JavaDoc에서도 명시해주지만 'Spring Security 에서 제공하는 Filter 클래스' 들은 아래와 같다.

 

  • 실제 코드를 보면 더 명확하게 알 수 있다.
  • addFilter()의 메소드 내부를 보면 comparator.isRegistered(filterClass)를 통해서 등록되어 있는 필터인지 확인한다.
    • 만약 아니라면 예외를 던진다.


 

해결방법

  • Spring Security 에서 제공되는 Filter클래스를 구현하거나 
  • 다른 방법으로는 addFilterBefore(),addFilterAfter() 를 사용하면 된다,
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        Filter authenticationFilter = new JwtAuthenticationFilter();

        http
                .csrf().disable()
                .addFilterBefore(authenticationFilter, UsernamePasswordAuthenticationFilter.class);
     }
}

 

반응형
댓글