Sto cercando un modo non invasivo per aggiungere un filtro captcha per determinate chiamate API.Ulteriori aggiungere il filtro captcha Spring Security solo per URL specifici
La mia configurazione è costituito da due WebSecurityConfigurerAdapters
con un filtro ciascuna (non il filtro captcha):
- api interno ("/ IAPI" uso filtro A su tutte le chiamate, ma anche ignorare alcuni pubblici richieste come/autenticazione)
- API esterna ("/ EAPI" uso filtro B per tutte le chiamate)
Ho Posso aggiungere un filtro prima del per gli articoli Spring Security, su public, interni api o chiamate api esterne? Non ho bisogno di SecurityContext, ho solo bisogno di controllare un Captcha nelle intestazioni delle richieste, inoltrare a FilterChain (filtri normali) o negare manualmente l'accesso. Ho provato a dichiarare un filtro in web.xml, ma ciò interrompe la possibilità di utilizzare l'iniezione delle dipendenze.
Qui è la mia Primavera Security Configuration:
@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();
}
}
Aggiornamento: Al momento ho una configurazione di lavoro con un filtro dichiarata in web.xml. Tuttavia, ha lo svantaggio di essere separato dal contesto primaverile (ad esempio, nessun autowiring di bean), quindi sto cercando una soluzione migliore che faccia leva su Spring.
Sommario: Ci sono due problemi rimanenti:
- aggiungere un filtro per URL specifici solo - utilizzando beforeFilter (...) all'interno di qualsiasi configurazione aggiunge un filtro a tutti gli URL di tale configurazione. Antmatcher non ha funzionato. Ho bisogno di qualcosa del genere:/iapi/captcha/,/external/captcha/,/public/captcha/*.
- Ho una publicap che ignora completamente Spring Security: (web .ignoring() .antMatchers ("/ public/**");). Devo bypassare Spring Security ma comunque dichiarare un filtro lì, usando Spring autowiring, ma non necessariamente Spring Security, dal momento che il mio captcha filter rifiuta o inoltra le chiamate solo in modo stateless.
Si sta parlando di 'Filtro A' e' Filtro B'. Sono segnaposto per il tuo filtro captcha o hai una vera implementazione per questo? In tal caso, potresti aggiornare la tua domanda di conseguenza? –
non proprio sicuro se è esattamente quello che stai cercando, ma ho trovato [questa risposta] (http://stackoverflow.com/a/11929129/4207875) a una domanda simile. Le differenze sono che aggiungono il filtro alla fine della catena e la configurazione è in XML, ma in javaconfig, anche l'http.addFilterBefore() fa il trucco. – saljuama
@ksokol Sono i filtri del sistema attuale, non voglio toccarli. – Journeycorner