2015-05-28 16 views
5

responsabilità: La mia domanda è in qualche modo simile a this question e this question, ma ho provato tutte le risposte suggerite in queste discussioni e già trascorso alcuni giorni alle prese con il problema.utilizzo selettivo di filtro CSRF di Primavera di sicurezza

Sto introducendo Spring Security 3.2.6 nella mia applicazione esistente (solo JSP, Servlet) e sto usando la configurazione Java. La mia applicazione verrà utilizzata sia dai browser che dai client non browser. Voglio che tutte le richieste del browser agli URL (ad esempio /webpages/webVersion/ e /webpages/webVersion2/) siano abilitate per CSRF e tutte le altre richieste siano CSRF disabilitate. I client senza browser non accedono mai sopra due URL, mentre l'applicazione browser può anche accedere agli URL disabilitati CSRF.

ho cercato una varietà di opzioni:

  1. Abilita Primavera di sicurezza solo sui URL sopracitato:

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
        http.authorizeRequests() 
         .antMatchers("/","/resources/****").permitAll() 
         .antMatchers("/webpages/webVersion/****", "/webpages/webVersion2/****").authenticated() 
         .antMatchers("/webpages/****").permitAll() 
         .anyRequest().anonymous() 
         .and() 
         .formLogin().loginPage("/webpages/webVersion/login/newLogin.jsp").failureUrl("/webpages/webVersion/login/newLogin.jsp?error=true").loginProcessingUrl("/j_spring_security_check") 
         .usernameParameter("username").passwordParameter("password").defaultSuccessUrl("/webpages/webVersion/login/loginSuccess.jsp", true).permitAll() 
         .and() 
         .logout().logoutUrl("/webpages/webVersion/logout.jsp").permitAll() 
         .and().exceptionHandling().accessDeniedPage("/webpages/webVersion/404-error-page.jsp") 
         .and() 
         .csrf(); 
    } 
    

    questo non ha funzionato mentre osservo che CSRF è abilitata per tutti gli URL.

  2. Provato using CSRFProtectionMatcher:

    .csrf().requireCsrfProtectionMatcher(csrfRequestMatcher); 
    

    CSRF è abilitata solo per gli URL destinati, ma anche /resources/** e /webpages/** URL devono essere controllati all'interno partite funzione. Sembra essere un po 'troppo considerando che sarà per tutte le richieste.

  3. provato ad utilizzare un'altra versione del metodo configure:

    @Override 
    public void configure(WebSecurity web) throws Exception { 
        web.ignoring().regexMatchers(".*?/jsp/(?!webVersion|webVersion2).*?"); 
    } 
    

    io non sono sicuro se ho fatto correttamente, ma questo non ha prodotto i risultati che volevo.


Quale dei approccio di cui sopra è quello corretto (Primavera di sicurezza) modo di fare quello che voglio? Come posso ottenere il comportamento desiderato dalla mia configurazione di Spring Security?

risposta

1

Si è scoperto che la loro era un certo errore con la mia configurazione e alla fine ho raggiunto l'obiettivo utilizzando approccio 3 .. Ho usato sotto versione della funzione di configurazione insieme con la solita funzione di configure(HttpSecurity http) ..

@Override 
public void configure(WebSecurity web) throws Exception { 
    web.ignoring().regexMatchers(".*?/jsp/(?!webVersion|webVersion2).*?"); 
} 
Problemi correlati