2015-05-28 3 views
5

Отказ от ответственности: Мой вопрос немного похож на this question и this question, но я пробовал все ответы, предложенные в этих потоков и уже провел несколько дней борется с этой проблемой.Выборочное использование CSRF фильтра Spring Security в

Я представляю Spring Security 3.2.6 в моем существующем приложении (JSP, только Servlet), и я использую конфигурацию Java. Мое приложение будет использоваться как браузерами, так и не-браузерами. Я хочу, чтобы все запросы браузера к URL-адресам (то есть /webpages/webVersion/ и /webpages/webVersion2/) были включенными CSRF, а все остальные запросы были отключены CSRF. Не-браузерные клиенты никогда не имеют доступа к двум URL-адресам, тогда как приложение-браузер также может получать доступ к CSRF-отключенным URL-адресам.

Я пробовал различные варианты:

  1. Включить 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 включена для всех URL.

  2. Пробовал с помощью CSRFProtectionMatcher:

    .csrf().requireCsrfProtectionMatcher(csrfRequestMatcher); 
    

    CSRF включен только для URL-адресов, предназначенных, но даже /resources/** и /webpages/** URL-адрес должен быть проверен внутри соответствует функции. Похоже, это немного, учитывая, что это будет для всех запросов.

  3. попытался использовать другую версию метода configure:

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

    Я не уверен, правильно ли я это правильно, но это не дало результатов, которые я хотел.


Какой из выше подхода является правильным (Spring Security) способ делать то, что я хочу? Как я могу достичь желаемого поведения из конфигурации Spring Security?

ответ

1

Оказалось, что их было какая-то ошибка с моей конфигурации и, наконец, я достиг цели, используя подход 3 .. я ниже версии функции конфигурирования наряду с обычной configure(HttpSecurity http) функции ..

@Override 
public void configure(WebSecurity web) throws Exception { 
    web.ignoring().regexMatchers(".*?/jsp/(?!webVersion|webVersion2).*?"); 
} 
Смежные вопросы