Как использовать разные фильтры для разных путей запросов в Spring Security? - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть два фильтра, и я хочу применить один для "/ relatorios / **", а другой для остальных.

Как это сделать?

Вот мой (не работает ) версия:

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.antMatcher("/relatorios/**")
                    .csrf()
                    .disable()
                    .sessionManagement()
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                    .and()
                    .addFilter(relatoriosFilter)
                    .addFilterBefore(new ExceptionTranslationFilter(new Http403ForbiddenEntryPoint()),
                                     relatoriosFilter.getClass())
                    .authorizeRequests()
                    .and()
                    .antMatcher("/**")
                    .csrf()
                    .disable()
                    .sessionManagement()
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                    .and()
                    .addFilter(authHeaderTokenFilter)
                    .addFilterBefore(new ExceptionTranslationFilter(new Http403ForbiddenEntryPoint()),
                                     authHeaderTokenFilter.getClass())
                    .authorizeRequests()
                    .anyRequest()
                    .authenticated();
    }

ОБНОВЛЕНИЕ:

В этой версии при вызове любого пути запроса вызываются оба фильтра. Я хочу, чтобы "/ relatorios / **" вызывал один фильтр, а все остальные вызывали другой фильтр.

1 Ответ

3 голосов
/ 18 февраля 2020

Вот два способа определить пути URL, к которым применяются фильтры.

Во-первых, вы должны знать, что при создании компонента класса фильтра, реализующего интерфейс фильтра, фильтр автоматически регистрируется в все конечные точки. Поскольку вы пытаетесь получить разные фильтры для разных путей, удалите это, если вы делаете это в своем коде.

Теперь вы можете зарегистрировать свои фильтры одним из двух следующих методов:

Метод 1 - Зарегистрируйте фильтры с помощью FilterRegistrationBean

В этом методе определенная цепочка безопасности не должна определять ваши клиенты фильтруют, поэтому удалите оба метода addFilter оттуда. Вы будете устанавливать пути не через цепочку, а через регистрационные компоненты.

@Configuration
public class FilterConfiguration {

    @Bean
    public FilterRegistrationBean<RelatoriosFilter> relatoriosFilter(){
        FilterRegistrationBean<RelatoriosFilter> registrationBean
                = new FilterRegistrationBean<>();

        registrationBean.setFilter(new RelatoriosFilter());
        registrationBean.addUrlPattern("/relatorios/*");
        registrationBean.setOrder(ORDERED.HIGHEST_PRECEDENCE);

        return registrationBean;
    }

    @Bean
    public FilterRegistrationBean<AuthHeaderTokenFilter> filter2(){
        FilterRegistrationBean<AuthHeaderTokenFilter> registrationBean
                = new FilterRegistrationBean<>();

        registrationBean.setFilter(new AuthHeaderTokenFilter());
        registrationBean.addUrlPattern("/*");
        registrationBean.setOrder(ORDERED.HIGHEST_PRECEDENCE);


        return registrationBean;
    }

}

Таким образом, вы также должны контролировать порядок фильтров, вызывая метод setOrder и давая меньшее число для более высокого значения. приоритет в цепочке фильтрации. Необходимый порядок будет зависеть от версии Spring, которую вы используете, и от того, какую часть цепочки вы хотите добавить в цепочку. В моем примере это будет первый фильтр.


Метод 2 - Разделение конфигураций WebSecurityConfigurerAdapter

Цепочка WebSecurityConfigurerAdapter не может определять две разные конфигурации фильтров путем сопоставления путей. Это одно из различных ограничений этой цепочки.

Это можно легко решить, создав дополнительную конфигурацию, чтобы каждая конфигурация соответствовала своему пути и применяла свой фильтр. В итоге вы получите две конфигурации.

Конфигурация 1

@Configuration
@Order(1)
public class RelatoriosSecurity extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .authorizeRequests()
                .and()
                .antMatcher("/relatorios/**")
                .addFilterBefore(new RelatoriosFilter(), ChannelProcessingFilter.class)
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests().anyRequest().authenticated();
    }

}

Конфигурация 2

@Configuration
@Order(2)
public class GeneralSecurity extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .antMatcher("/**")
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .addFilterBefore(new AuthHeaderTokenFilter(), ChannelProcessingFilter.class)
                .authorizeRequests().anyRequest().authenticated();
    }

}

В этом методе аннотация @Order определяет порядок выполнения цепочки, так же, как ваше первоначальное решение, цепочка RelatoriosSecurity будет выполняться до цепочки GeneralSecurity. Кроме того, addFilterBefore будет определять, перед каким фильтром будет работать предоставленный фильтр. Класс фильтра, который должен появиться раньше, будет зависеть от вашей версии Spring, но в моем случае ChannelProcessingFilter является первым, поэтому наш предоставленный фильтр будет выполнен первым, перед ChannelProcessingFilter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...