복붙노트

[SPRING] Spring webSecurity.ignoring ()은 사용자 정의 필터를 무시하지 않습니다.

SPRING

Spring webSecurity.ignoring ()은 사용자 정의 필터를 무시하지 않습니다.

스프링 4 MVC + 보안 + 부트 프로젝트에 커스텀 인증 필터를 설정했습니다. 필터가 제대로 작동하고 이제 일부 URI (예 : / api / **)의 보안을 사용하지 않도록 설정하려고합니다. 여기에 내 구성이있다.

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
    @Override
    public void configure(WebSecurity webSecurity) throws Exception {
        webSecurity.ignoring().antMatchers("/api/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
       http.authorizeRequests()
                 .anyRequest().authenticated()
              .and()
                 .addFilterBefore(filter, BasicAuthenticationFilter.class);
    }
}

불행히도, / api / 아래의 리소스를 호출 할 때 ... 필터는 여전히 연결되어 있습니다. 필자는 필자의 필터에 println을 추가했으며 모든 호출시 콘솔에 기록됩니다. 내 구성에 어떤 문제가 있는지 알고 있습니까?

최신 정보

필터 코드 :

@Component
public class EAccessAuthenticationFilter extends RequestHeaderAuthenticationFilter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("FILTER");
        if(SecurityContextHolder.getContext().getAuthentication() == null){
            //Do my authentication stuff
            PreAuthenticatedAuthenticationToken authentication = new PreAuthenticatedAuthenticationToken(user, credential, authorities);
            SecurityContextHolder.getContext().setAuthentication(authentication);
        }  
        super.doFilter(request, response, chain);
     }

    @Override
    @Autowired
    public void setAuthenticationManager(AuthenticationManager authenticationManager) {
        super.setAuthenticationManager(authenticationManager);
    }

}

해결법

  1. ==============================

    1.EAccessAuthenticationFilter 클래스에서 @Component를 제거하면 다음과 같이됩니다.

    EAccessAuthenticationFilter 클래스에서 @Component를 제거하면 다음과 같이됩니다.

    @Override
    protected void configure(HttpSecurity http) throws Exception {
       http.authorizeRequests()
                 .anyRequest().authenticated()
              .and()
                 .addFilterBefore(new EAccessAuthenticationFilter(), BasicAuthenticationFilter.class);
    }
    

    https://github.com/spring-projects/spring-security/issues/3958

  2. ==============================

    2.몇 가지 테스트를 거친 후 실제로 구성이 정상적으로 작동하고 이해하는 데 문제가 있다는 것을 깨달았습니다. spring.security.ignored = / api / **는 필터를 우회하거나 끄지 않습니다. 실제로 모든 요청은 여전히 ​​내 커스텀 필터를 통과하지만, 차이점은 Spring Security는 인증 상태 나 커스텀 필터로부터 오는 허가 된 권한을 신경 쓰지 않는다는 점입니다.

    몇 가지 테스트를 거친 후 실제로 구성이 정상적으로 작동하고 이해하는 데 문제가 있다는 것을 깨달았습니다. spring.security.ignored = / api / **는 필터를 우회하거나 끄지 않습니다. 실제로 모든 요청은 여전히 ​​내 커스텀 필터를 통과하지만, 차이점은 Spring Security는 인증 상태 나 커스텀 필터로부터 오는 허가 된 권한을 신경 쓰지 않는다는 점입니다.

    나는 "무시 된"속성이 스프링 보안 필터를 우회하는 것에 대해 궁금해하고있었습니다. 내가 완전히 틀린 것처럼 들린다.

  3. ==============================

    3.난 항상이 일을하는 가장 쉬운 방법은 application.properties에이 구성을 넣는 것입니다.

    난 항상이 일을하는 가장 쉬운 방법은 application.properties에이 구성을 넣는 것입니다.

    security.ignored=/api/**
    
  4. ==============================

    4.필자는 코멘트를 추가할만한 충분한 평판이 없지만, kimhom의 대답에 대한 설명을 좀 더 찾고있는 저와 같은 사람들에게는 WebSecurityConfigurerAdapter가 Spring Security에 추가 된 필터를 무시하도록 지시합니다. @Component (또는 @Bean의 모든 풍미) 주석은 Spring에게 보안 체인 외부에 필터를 (다시) 추가하라고 지시했기 때문에 여전히 필터가 호출되었습니다. 따라서 필터가 보안 체인에서 무시되는 동안 다른 (비보안?) 체인에 의해 무시되지 않았습니다.

    필자는 코멘트를 추가할만한 충분한 평판이 없지만, kimhom의 대답에 대한 설명을 좀 더 찾고있는 저와 같은 사람들에게는 WebSecurityConfigurerAdapter가 Spring Security에 추가 된 필터를 무시하도록 지시합니다. @Component (또는 @Bean의 모든 풍미) 주석은 Spring에게 보안 체인 외부에 필터를 (다시) 추가하라고 지시했기 때문에 여전히 필터가 호출되었습니다. 따라서 필터가 보안 체인에서 무시되는 동안 다른 (비보안?) 체인에 의해 무시되지 않았습니다.

    이것은 2 주간의 두통을 해결해주었습니다. 제 경우에는 보안 체인이 실행되지 않았기 때문에 내 사용자 지정 필터에 null로 계속 올라온 SecurityContext에 의해 주어진 Authentication 개체가 필요했습니다.

  5. from https://stackoverflow.com/questions/39152803/spring-websecurity-ignoring-doesnt-ignore-custom-filter by cc-by-sa and MIT license