Подтвердить что ты не робот

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

4b9b3361

Ответ 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"/>

Просто имейте в виду, что порядок важен, если вы собираетесь использовать карту всех запросов с использованием символа '*'.