Szukam nieinwazyjnego sposobu dodawania filtra captcha dla niektórych połączeń API.Howto dodatkowo dodać filtr captcha Spring Security dla konkretnych adresów URL tylko
Moja konfiguracja składa się z dwóch WebSecurityConfigurerAdapters
z jednym filtrem każdy (nie filtru captcha):
- api Wewnętrzne („/ IAPI” Zastosowanie filtrować na wszystkich połączeń, ale również ignorować niektóre publicznych żądań jak/Uwierzytelnij)
- zewnętrznego interfejsu API ("/ EAPI" zastosowanie Filtr B na wszystkich połączeń)
Ho w Czy mogę dodać filtr przed rzeczy Spring Security, publicznych, wewnętrznych api lub zewnętrznych api? Nie potrzebuję SecurityContext, wystarczy sprawdzić Captcha w nagłówkach żądań, przesłać filtr Filterhhain (zwykłe filtry) lub ręcznie odmówić dostępu. Próbowałem zadeklarować filtr w web.xml, ale to łamie zdolność do korzystania z wtrysku zależności.
Tu jest mój konfiguracji zabezpieczeń Wiosna:
@EnableWebSecurity
public class SpringSecurityConfig {
@Configuration
@Order(1)
@EnableGlobalMethodSecurity(securedEnabled = true)
public static class InternalApiConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Autowired
private Filter filterA;
public InternalApiConfigurerAdapter() {
super(true);
}
@Override
public void configure(WebSecurity web) throws Exception {
web
.ignoring()
.antMatchers("/public/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/iapi/**")
.exceptionHandling().and()
.anonymous().and()
.servletApi().and()
.authorizeRequests()
.anyRequest().authenticated().and()
.addFilterBefore(filterA, (Class<? extends Filter>) UsernamePasswordAuthenticationFilter.class);
}
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return authenticationManager();
}
}
@Configuration
@Order(2)
@EnableGlobalMethodSecurity(securedEnabled = true)
public static class ExternalApiConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Autowired
private FilterB filterB;
public ExternalApiConfigurerAdapter() {
super(true);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/external/**")
.exceptionHandling().and()
.anonymous().and()
.servletApi().and()
.authorizeRequests()
.anyRequest().authenticated().and()
.addFilterBefore(filterB, (Class<? extends Filter>) UsernamePasswordAuthenticationFilter.class);
}
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return authenticationManager();
}
}
Aktualizacja: W tej chwili mam konfigurację roboczą z filtrem zadeklarowanej w web.xml. Ma jednak tę wadę, że jest oddzielony od kontekstu wiosennego (np. Bez automatycznego tworzenia fasoli), więc szukam lepszego rozwiązania wykorzystującego sprężynę.
Podsumowanie: Istnieją dwa pozostałe problemy:
- dodać filtr dla konkretnych adresów URL tylko - używając beforeFilter (...) wewnątrz dowolnej konfiguracji Dodaje filtr do wszystkich adresów URL tej konfiguracji. Narzędzia antyspamowe nie działały. Potrzebuję czegoś takiego:/iapi/captcha/,/external/captcha/,/public/captcha/*.
- Mam publiczne api, które całkowicie pomija Spring Security: (web .ignoring() .antMatchers ("/ public/**");). Muszę ominąć Spring Security, ale nadal zadeklarować tam filtr, używając Spring autowiring, ale niekoniecznie Spring Security, ponieważ mój filtr captcha odrzuca lub przekierowuje połączenia w sposób bezpaństwowy.
Mówisz o "Filtrze A" i "Filtrze B". Czy są one elementami zastępczymi dla twojego filtru captcha, czy też masz na to realną implementację? Jeśli tak, czy możesz odpowiednio zaktualizować swoje pytanie? –
Nie jestem pewien, czy to dokładnie to, czego szukasz, ale znalazłeś [tę odpowiedź] (http://stackoverflow.com/a/11929129/4207875) na podobne pytanie. Różnice polegają na tym, że dodają filtr na końcu łańcucha, a konfiguracja jest w XML, ale w javaconfig, http.addFilterBefore() również działa. – saljuama
@ksokol Są to filtry obecnego systemu, nie chcę ich dotykać. – Journeycorner