Spring Безопасность: включить/отключить CSRF по типу клиента (браузер/не-браузер)
Spring doc говорит
"Когда вы используете CSRF-защиту? Наша рекомендация - использовать защиту CSRF для любого запроса, который может быть обработан браузером обычными пользователями. Если вы создаете только сервис, который используется не-браузерами, вы, скорее всего, будете хотите отключить защиту CSRF".
Что делать, если моя служба будет использоваться как "браузером", так и "не-браузерными" клиентами, например внешними службами сторонних организаций, обеспечивает ли spring безопасность отключать csrf исключительно для определенных типов клиентов?
Ссылка: http://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/html/csrf.html
Ответы
Ответ 1
Я уверен, что есть способ сделать это в Spring Security XML, но поскольку я использую Java Config, вот мое решение.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Configuration
@Order(1)
public static class SoapApiConfigurationAdapter extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/soap/**")
.csrf().disable()
.httpBasic();
}
}
@Configuration
public static class WebApiConfigurationAdapter extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin()
.loginProcessingUrl("/authentication")
.usernameParameter("j_username")
.passwordParameter("j_password").permitAll()
.and()
.csrf().disable()
}
}
}
Ответ 2
ИМХО, нет ничего подобного из коробки. Что бы я сделал в вашем случае, это иметь иерархию URL-адреса, например, с корнем в /api
, которая будет освобождена от csrf. Его легко настроить. В xml config у вас есть нормальный блок <http>
, включая <csrf/>
, вы просто дублируете его и модифицируете первый блок, подобный этому
<http pattern="/api/**">
...
<!-- csrf -->
</http>
Как и прежде, он будет запущен для любого запроса /api
hierachy без использования csrf, и все остальные запросы будут использовать его.
В нормальной части приложения вы никогда не используете URL-адрес /api/**
и сохраняете их в режимах без браузера.
Затем в ваших контроллерах вы сопоставляете их как с их обычным url, так и с копией в /api
:
@Controller
@RequestMapping({ "/rootcontrollerurl", "/api/rootcontrollerurl"})
class XController {
@RequestMapping(value = "/request_part_url", ...)
public ModelAndView method() {
...
}
}
(конечно, rootcontrollerurl
и request_part_url
может быть пустым...)
Но вы должны проанализировать влияние безопасности на разрешение неконтролируемых запросов csrf и в конечном итоге исключить контроллеры из иерархии /api
.
Ответ 3
Вот что я использовал для отключения защиты CSRF на определенной конечной точке
на вашем appconfig-security.xml добавьте node с информацией о вашем шаблоне, например, в следующем примере:
<http security="none" pattern="/sku/*"/>
<http security="none" pattern="/sku/*/*"/>
<http security="none" pattern="/sku"/>
Просто имейте в виду, что порядок важен, если вы собираетесь использовать карту всех запросов с использованием символа '*'.