Вот два способа определить пути 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.