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:
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.
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.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?