Wdrożyłem Customfilter, który dodaje coś z plików cookie żądań do jego nagłówków:

@Component
@Slf4j
public class MyCustomFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
        .... some logic...
        log.info("Sending request to next chain for validation..");
        chain.doFilter(request, response);
        log.info("Authentication completed sucessfully");
    }

    @Bean
    // This method is needed to replace the default cookieFilter.json processor of tomcat that ignores the jwt cookieFilter.json
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> cookieProcessorCustomizer() {
        return tomcatServletWebServerFactory -> tomcatServletWebServerFactory.addContextCustomizers((TomcatContextCustomizer) context -> {
            context.setCookieProcessor(new LegacyCookieProcessor());
        });
    }

}

My WebSecurityConFigureRadapter Class:

@Configuration
public class AuthSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        //configuring strategy
        http.sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                .authorizeRequests()
                .anyRequest().authenticated().and()
                .oauth2ResourceServer().jwt().and();
        http.csrf().disable();
        http.addFilterBefore(new MyCustomFilter (), UsernamePasswordAuthenticationFilter.class);
        http.exceptionHandling().authenticationEntryPoint(new AuthExceptionEntryPoint());
    }

}

Po uruchomieniu kodu i wysłać prośbę za pośrednictwem Postana / Curl, widzę, że filtr wywołał dwukrotnie

Sending request to next chain for validation..
Sending request to next chain for validation..
Authentication completed sucessfully
Authentication completed sucessfully

Znalazłem kilka postów o problemie i próbowałem następujących rozwiązań:

  1. Zdarza się, że wiosna automatycznie rejestruje fasolę i ręcznie dodam filtr w metodzie konfiguracji. Dlatego usunęłam ręcznie dodawanie filtra w metodzie konfiguracji (). Rezultatem było to, że filtr nie zadzwonił.

  2. Zamiast wdrażać interfejs filtra, spróbuj rozszerzyć klasę OncePerRequestFilter. Zrobiłem to, ale filtr nadal wywołuje dwukrotnie.

  3. Próbowałem również usunąć adnotację @Component i ręcznie dodać filtr. Ponadto musiałem przenieść fasoli CookieProcessor do klasy konfiguracji. Problem poruszony później jest to, że aplikacja nie uruchomi się z powodu następującego błędu:

    Spowodowane przez: org.springframework.beans.beaninstantionException: Nie udało się utworzyć instancji [ORG zagnieżdżony wyjątek to java.lang.illegalstateException: bez zestawu serwettext

Używam wiosennego w wersji 5.3.3.

0
JeyJ 7 październik 2020, 12:53

1 odpowiedź

Najlepsza odpowiedź

Jako zasadę kciuka nie dodaje @Bean metody do klasy @Component, ponieważ te są obsługiwane inaczej niż w klasach {x2}}. (Patrz to).

Twój kod w @Bean jest zbyt skomplikowany. Utwórz i zwróć TomcatContextCustomizer, aby wykonać modyfikację. Twój kod doprowadzi do odniesień cyrkulicznych, które doprowadzą do inicjowania błędów.

Dodaj następujące @Bean Metoda do swojej klasy @SpringBootApplication

@Bean
public TomactContextCustomizer cookieProcessorCustomizer() {
  return (context) -> context.setCookieProcessor(new LegacyCookieProcessor());
}

Teraz w twoim Filter albo usuń @Component lub dodać miło FilterRegistrationBean, aby zapobiec dodaniu go do regularnego łańcucha filtrów. (Spring Boot automatycznie rejestruje wszystkie wykryte Filter instancje do regularnego łańcucha filtrującego).

@Bean
public FilterRegistrationBean<MyFilter> myFilterRegistrationBean(MyFilter myFilter) {
  FilterRegistrationBean<MyFilter> frb = new FilterRegistrationBean<>(myFilter);
  frb.setEnabled(false);
  return frb;
}

Jeśli usuniesz @Component Powyższy fragment nie jest potrzebny, jeśli nie należy ponownie użyć zeskanowanego MyFilter instancji w konfiguracji zabezpieczeń.

@Configuration
public class AuthSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private MyFilter myFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        //configuring strategy
        http.sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                .authorizeRequests()
                .anyRequest().authenticated().and()
                .oauth2ResourceServer().jwt().and();
        http.csrf().disable();
        http.addFilterBefore(myFilter, UsernamePasswordAuthenticationFilter.class);
        http.exceptionHandling().authenticationEntryPoint(new AuthExceptionEntryPoint());
    }

}
1
M. Deinum 8 październik 2020, 05:21