2015-07-30 2 views
0

Я использую Spring Security с Thymeleaf и хочу создать логин и регистрационную форму на разных сайтах, которые делают использование CSRF-защиты. Защита сайта входа в систему легко, как и с конфигурацией folloing WebSecuritySpring Boot, Spring Security и Thymeleaf: Применить CsrfFilter на веб-сайт с формой

@Override 
protected void configure(final HttpSecurity http) throws Exception { 
    http 
      .formLogin() 
      .loginPage("/login") 
      .permitAll() 
      .and() 
      .requestMatchers() 
      .antMatchers("/login", "/oauth/authorize", "/oauth/confirm_access") 
      .and() 
      .authorizeRequests() 
      .anyRequest() 
      .authenticated(); 
} 

Spring поддерживает добавление защиты от CSRF в целом по цепочке фильтров безопасности, который строится в методе конфигурирования. Эта цепочка фильтров содержит CSRFFilter, который добавляет/оценивает токен CSRF. Эта цепочка фильтров затем используется для всех совпадений, определенных в приведенной выше конфигурации. Механизм получения фильтров, которые применяются к запросу могут быть найдены here в методе

doFilterInternal(ServletRequest, ServletResponse, FilterChain)

проблема, если добавить «/ зарегистрировать» сайт этой конфигурации, пользователь перенаправляется сначала "/ login". Если я не добавлю его к вышеуказанной конфигурации, упомянутый фильтр FilterChain не применяется (и не CsrfFilter).

Так что я хочу, чтобы повторно использовать CsrfFilter в цепочке фильтров на сайте «/ register», но я не знаю, как это сделать.

Я бы предпочел этот подход к другим идеям, например, написать собственный фильтр CSRF, как предложено here или here.

ответ

0

Оказалось, что Спринг цепь фильтра безопасности применяется ко всем конечным точкам, указанным в списке, предоставляемой requestMatchers() antMatchers().

Таким образом, чтобы использовать защиту CSRF для сайта, который не является сайтом входа в систему, мне просто нужно было добавить его в этот список, а затем разрешить доступ к нему, так что переадресация на страницу входа не будет. Моя окончательная конфигурация выглядит так:

@Override 
protected void configure(final HttpSecurity http) throws Exception { 
    http.requestMatchers() 
      // consider these patterns for this config and the Security Filter Chain 
      .antMatchers("/login", "/register", "/oauth/authorize", "/oauth/confirm_access", "/oauth/token_key", 
        "/oauth/check_token", "/oauth/error") 
      .and() 
      // define authorization behaviour 
      .authorizeRequests() 
      // /register is allowed by anyone 
      .antMatchers("/register").permitAll() 
      // /oauth/authorize needs authentication; enables redirect to /login 
      .antMatchers("/oauth/authorize").authenticated() 
      // any other request in the patterns above are forbidden 
      .anyRequest().denyAll() 
      .and() 
      .formLogin() 
      // we have a custom login page at /login 
      // that is permitted to everyone 
      .loginPage("/login").permitAll(); 
} 
0

Из всего этого я понял, что проблема в том, что вы хотите, чтобы люди обращались/регистрировались без необходимости входа в систему. Что это легко исправить:.

@Override 
protected void configure(final HttpSecurity http) throws Exception { 
    http 
      .formLogin() 
      .loginPage("/login") 
      .permitAll() 
      .and() 
      .requestMatchers() 
// add this line 
.antMatchers("/register").permitAll().and 

// 
      .antMatchers("/login", "/oauth/authorize", "/oauth/confirm_access") 
      .and() 
      .authorizeRequests() 
      .anyRequest() 
      .authenticated(); 
} 
+0

Hi Aeseir! Это не проблема. Моя цель - включить защиту CSRF в моей/регистрационной форме. Spring поддерживает добавление защиты CSRF в целом с помощью цепочки фильтров безопасности, которая встроена в метод configure. Эта цепочка фильтров содержит CSRFFilter, который добавляет/оценивает токен CSRF. Если я добавлю сайт/register так, как вы предположили, что сайт будет игнорироваться в цепочке фильтров, и поэтому защита CSRF не будет использоваться. Ссылки, которые я добавил в свой пост, предлагают способы добавления механического механизма защиты CSRF, но я предпочел бы повторно использовать существующий к весне. – zersaegen

+0

Я, должно быть, неправильно понял. Итак, вы создаете настраиваемую цепочку фильтров безопасности вместо использования существующей и, следовательно, проблемы? – Aeseir

Смежные вопросы