Spring Boot - после запроса с токеном CSRF выдается ошибка 403 - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь реализовать защиту токенов CSRF в моем Spring Boot API, чтобы узнать, как с этим справиться.

Я следовал этому руководству (часть на стороне сервера) и это моя конфигурация безопасности:

private static final String[] CSRF_IGNORE = {"/api/login"};


protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf()
                .ignoringAntMatchers(CSRF_IGNORE)
                .csrfTokenRepository(csrfTokenRepository())
                .and()
                .addFilterAfter(new CustomCsrfFilter(), CsrfFilter.class)
                .exceptionHandling()
                .authenticationEntryPoint(new Http403ForbiddenEntryPoint() {
                })
                .and()
                .authenticationProvider(getProvider())
                .formLogin()
                .loginProcessingUrl("/api/login")
                .successHandler(new AuthentificationLoginSuccessHandler())
                .failureHandler(new SimpleUrlAuthenticationFailureHandler())
                .and()
                .logout()
                .logoutUrl("/api/logout")
                .logoutSuccessHandler(new AuthentificationLogoutSuccessHandler())
                .invalidateHttpSession(true)
                .and()
                .authorizeRequests()
                .anyRequest().authenticated();
    }

Другие вещи такие же, как в учебнике.

Я тестирую с почтальоном.

Когда я добавляю конечную точку, я хочу в CSRF_IGNORE я могу видеть с помощью logger / debug, что накопленный токен и токен от cook ie совпадают, поскольку часть конфигурации безопасности CustomCsrfFilter. java в .addFilterAfter () используется, но когда я удаляю конечную точку из этого CSRF_IGNORE, я получаю 403, и logger / debug в CustomCsrfFilter. java не используется так что я думаю, что токены не сравниваются.

Я думаю, что что-то пропустил, и я хотел бы понять.

1 Ответ

0 голосов
/ 21 апреля 2020

Если вы хотите использовать CSRF с ложным поваром только для http ie, почему бы не использовать встроенную в Spring Security CookieCsrfTokenRepository? Это должно упростить ваш конфиг. CustomCsrfFilter, кажется, добавляет XSRF-TOKEN cook ie к HttpServletResponse, что CookieCsrfTokenRepository делает для вас .

Имя по умолчанию CSRF cook ie, когда использование CookieCsrfTokenRepository - это X-CSRF-TOKEN, которое обычно используется по умолчанию для имени Angular HttpClientXsrfModule. Конечно, вы можете настроить это, если вам нужно.

Таким образом, ваша конфигурация безопасности становится такой:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf()
                    .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                .and()
                .exceptionHandling()
                    .authenticationEntryPoint(new Http403ForbiddenEntryPoint())
                .and()
                    .authenticationProvider(getProvider())
                .formLogin()
                    .loginProcessingUrl("/api/login")
                    .successHandler(new AuthentificationLoginSuccessHandler())
                    .failureHandler(new SimpleUrlAuthenticationFailureHandler())
                .and()
                .logout()
                    .logoutUrl("/api/logout")
                    .logoutSuccessHandler(new AuthentificationLogoutSuccessHandler())
                    .invalidateHttpSession(true)
                .and()
                .authorizeRequests()
                    .anyRequest().authenticated();
    }

И с Angular ваш модуль приложения имеет HttpClientXsrfModule как

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule,
    HttpClientXsrfModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
...