选择性使用Spring Security的CSRF过滤器

时间:2015-05-28 05:58:50

标签: java spring spring-security csrf-protection

免责声明:我的问题与this questionthis question有点相似,但我已经尝试了这些主题中建议的所有答案,并且已经花了几天时间来解决这个问题

我在现有的应用程序(JSP,Servlet)中引入了Spring Security 3.2.6,我使用的是Java配置。我的应用程序将被浏览器和非浏览器客户端使用。我希望所有对URL的浏览器请求(即/webpages/webVersion//webpages/webVersion2/)都启用CSRF,并且所有其他请求都禁用CSRF。非浏览器客户端从不访问上述两个URL,而浏览器应用程序也可以访问CSRF禁用的URL。

我尝试过各种选择:

  1. 仅在前面提到的URL上启用Spring Security:

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

    当我观察到所有网址都启用了CSRF时,这并没有奏效。

  2. 尝试使用CSRFProtectionMatcher

    .csrf().requireCsrfProtectionMatcher(csrfRequestMatcher); 
    

    CSRF仅针对目标网址启用,但即使/resources/**/webpages/**网址也需要在匹配功能中进行检查。考虑到它将适用于所有请求,似乎有点多。

  3. 尝试使用其他版本的configure方法:

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

    我不确定我是否做得不对,但这并没有产生我想要的结果。

  4. 上述哪种方法是正确的(Spring Security)做我想要的方式?如何从Spring Security配置中实现所需的行为?

1 个答案:

答案 0 :(得分:2)

事实证明他们的配置有些错误,最后我使用方法3实现了目标。我使用了以下版本的configure函数以及通常的configure(HttpSecurity http)函数..

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