2015-12-16 25 views
8

Belirli api çağrıları için captcha filtresi eklemek için invaziv olmayan bir yöntem arıyorum.Ayrıca, yalnızca belirli URL'ler için Spring Security captcha filtresi ekleyin

  • İç api ("/ iapi" kullanım Filtre A tüm çağrılarda değil, aynı zamanda bazı kamu isteklerini görmezden:

    Benim kurulum bir filtreye her (değil Captcha filtresi) ile iki WebSecurityConfigurerAdapters oluşur gibi/authenticate) tüm çağrılarda

  • Harici aPI ("/ EAPI" kullanım Filtre B)

Ho w Spring Spring cihazından önce halka, dahili api veya harici api aramalarına filtre ekleyebilir miyim? SecurityContext'e ihtiyacım yok, sadece istek başlıklarında bir Captcha’yı kontrol etmeli, filterChain’e (normal filtreler) yönlendirmeli ya da erişimi manüel olarak reddetmeliyim. Web.xml'de bir filtre bildirmeyi denedim, ancak bu bağımlılık enjeksiyonunu kullanma yeteneğini kırıyor.

@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(); 
     } 
    } 

Güncelleme: Ben web.xml''deki ilan filtreli bir çalışma yapılandırmasına sahip anda

İşte benim Bahar Güvenlik Yapılandırma olduğunu. Bununla birlikte, Bahar Bağlamından ayrılmanın dezavantajı vardır (örneğin, çekirdeklerin otomatik olarak bağlanması gibi), bu yüzden Bahar'dan daha iyi bir çözüm bulmaya çalışıyorum.

Özeti:

  1. sadecebelirli URL'ler için bir filtre ekleyin - herhangi bir yapılandırma içine beforeFilter (...) kullanarak bu yapılandırmanın tüm URL'ler için bir filtre ekler: Kalan iki sorunlar vardır. Antmatcher işe yaramadı. Bunun gibi bir şeye ihtiyacım var:/iapi/captcha/,/external/captcha/,/public/captcha/*.
  2. Spring Security ürününü tamamen atlayan bir genel anım var: (web .ignoring() .antMatchers ("/ public/**");). Spring Security cihazını baypas etmem gerekiyor ama yine de Spring autowiring özelliğini kullanarak bir süzgeç bildirmem gerekiyor, ancak Spring Güvenlik özellikleri zorunlu değil, çünkü captcha filtresim yalnızca çağrıları vatansız bir şekilde reddediyor veya ileri sürüyor.
+1

“A Filtresi” ve “B Filtresi” hakkında konuşuyorsunuz. Captcha filtreniz için yer tutucuları mı yoksa bunun için gerçek bir uygulamanız var mı? Eğer öyleyse, sorunuzu buna göre güncelleyebilir misiniz? –

+1

tam olarak aradığınızı tam olarak bilmiyor, ancak benzer bir soruya [bu yanıtı] (http://stackoverflow.com/a/11929129/4207875) buldu. Farklılıklar, filtrenin zincirin sonuna eklendikleri ve yapılandırmanın XML biçimindedir, ancak javaconfig'te, http.addFilterBefore() de hile yapar. – saljuama

+0

@ksokol Geçerli sistemin filtreleridir, onlara dokunmak istemiyorum. – Journeycorner

cevap

5

UsernamePasswordAuthenticationFilter'dan önce eklenmiş olan A ve B filtreleriyle çalışan bir yapılandırmanız zaten var, bu yüzden başka bir özel filtre eklemek kolay olmalıdır. o @Autowired enjekte edilmeye hazır olacak şekilde

İlk olarak, @Component ile sınıfını annotating veya @Bean@Configuration bir iç sınıf olarak ya filtre oluşturma ve bir fasulye olarak ilan.

Şimdi A ve B filtresi olarak enjekte edebilir ve kullanabilirsiniz.Bahar Güvenlik filtre zincirinde her şeyden önce filtreyi eklemek için bunu Bahar Güvenlik referans belgelerinde Filter Ordering bölümüne göre, zincirdeki ilk Filtre, ChannelProcessingFilter olduğunu, bunu yapardım:

@Autowired 
private CaptchaFilter captchaFilter; 

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
      .antMatcher("/iapi/**") 
      .addFilterBefore(captchaFilter, (Class<? extends Filter>) ChannelProcessingFilter.class) 
      .addFilterBefore(filterA, (Class<? extends Filter>) UsernamePasswordAuthenticationFilter.class) 
      .authorizeRequests() 
       .anyRequest().authenticated(); 
    } 
bu arada

, WebSecurityConfigurerAdapter uzanan zaman bu zaten dahil çünkü exceptionHandling()anonymous() ve servletApi() o HttpSecurity javadoc

unutmayın devletler olarak aslında, daha yapılandırma ayrıntılarını belirtirken anonymous() haricinde ihtiyaç olmadığını Bahar Güvenlik "entrypoin t ", DelegatingFilterProxy hala filtrenizden önce yürütülür, ancak bu bileşen yalnızca zinciri ilk filtreye gönderir, bu durumda bu durumda CaptchaFilter olur, bu nedenle filtrenizi gerçekten Spring Security'den başka bir şeyden önce yürütürsünüz .

Ancak yine de captcha filtresinin DelegatingFilterProxy'dan önce yürütülmesini istiyorsanız, Spring Security yapılandırmasında bunu yapmanın bir yolu yoktur ve bunu web.xml dosyasında bildirmeniz gerekir.


Güncelleme: Başka konfigürasyonlarda kaptan filtre eklemek arzu etmezseniz, her zaman üçüncü bir yapılandırması ekleyebilirsiniz ve aşağıdaki gibi yapılandırmaları sınıf olacaktır: By

@EnableWebSecurity 
@EnableGlobalMethodSecurity(securedEnabled = true) 
public class SpringSecurityConfig { 

    @Configuration 
    @Order(1) 
    public static class CaptchaApiConfigurerAdatper extends WebSecurityConfigurerAdapter { 

     @Autowired 
     private CaptchaFilter captchaFilter; 

     public CaptchaApiConfigurerAdatper() { 
      super(true); 
     } 

     @Override 
     public void configure(WebSecurity web) throws Exception { 
      web 
        .ignoring() 
        .antMatchers("/public/**"); 
     } 

     @Override 
     protected void configure(HttpSecurity http) throws Exception { 
      http 
        .requestMatchers() 
         .antMatcher("/iapi/captcha**") 
         .antMatcher("/external/captcha**") 
         .and() 
        .addFilterBefore(captchaFilter, (Class<? extends Filter>) ChannelProcessingFilter.class) 
        .authorizeRequests() 
         .anyRequest().authenticated(); 
     } 
    }    

    @Configuration 
    @Order(2) 
    public static class InternalApiConfigurerAdapter extends WebSecurityConfigurerAdapter { 

     // ommiting code for the sake of clarity 
    } 

    @Configuration 
    @Order(3) 
    public static class ExternalApiConfigurerAdapter extends WebSecurityConfigurerAdapter { 

     // ommiting code for the sake of clarity 
    } 

yol, başka bir ipucu, belirli yapılandırmalar dışındaki tüm ortak yapılandırmayı, ana sınıf için, @EnableGlobalMethodSecurity(securedEnabled = true) AuthenticationManager, WebSecurity gibi, halk için güvenliği atlamak için ana sınıfı, ancak ana sınıfta hiçbir şey genişletmiyorsa, @Autowire yöntem beyanları.

Göz ardı olacağını /public/**/public/captcha** ile HttpSecurity için eşleştirici görmezden eğer, WebSecurity ile bir sorun olacağını rağmen, bu yüzden, sen WebSecurity dışarı planı ayrı ve CaptchaConfig sınıfında farklı bir desen var olmamalı tahmin yüzden örtüşmez.

+0

Üzgünüz, bu yaklaşımı zaten denedim. Bu iki filtreyi herhangi bir istek üzerine kullanır, ancak belirli yollara ihtiyacım var. Ayrıca, onları Spring Security olmayan aramalara eklemeyi hala bilmiyorum. Sorumu buna göre güncelledim. İstisna işleme ile ilgili ipucu için teşekkürler, bu şeyler Spring Security'i daha iyi anlamama yardımcı oluyor! – Journeycorner

+0

Captcha filtresi için üçüncü bir yapılandırma eklemekten sizi durduran hiçbir şey yok, sadece @ Order’i göz önünde bulundurun, cevabı bir örnekle güncelleyeceğim. – saljuama

İlgili konular