Отказ от ответственности: Мой вопрос немного похож на 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-адресам.
Я пробовал различные варианты:
Включить 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.
Пробовал с помощью
CSRFProtectionMatcher
:.csrf().requireCsrfProtectionMatcher(csrfRequestMatcher);
CSRF включен только для URL-адресов, предназначенных, но даже
/resources/**
и/webpages/**
URL-адрес должен быть проверен внутри соответствует функции. Похоже, это немного, учитывая, что это будет для всех запросов.попытался использовать другую версию метода
configure
:@Override public void configure(WebSecurity web) throws Exception { web.ignoring().regexMatchers(".*?/jsp/(?!webVersion|webVersion2).*?"); }
Я не уверен, правильно ли я это правильно, но это не дало результатов, которые я хотел.
Какой из выше подхода является правильным (Spring Security) способ делать то, что я хочу? Как я могу достичь желаемого поведения из конфигурации Spring Security?