Spring Boot 2.2.0.RELEASE выдает InvalidCsrfTokenException при превышении максимального размера файла при загрузке файла - PullRequest
1 голос
/ 29 октября 2019

Использование Spring Boot 2.2.0.RELEASE, когда я загружаю файлы, размер которых меньше max-file-size и max-request-size загрузка успешно завершена. Когда я загружаю файл больше этих максимумов, я получаю InvalidCsrfTokenException.

. Я пытался вручную добавить токен csrf в форму, но это не сработало, и я не хочу идти по маршрутудобавления токена в качестве параметра запроса. Я кое-что прочитал об изменении порядка составного фильтра и фильтров безопасности Spring, чтобы токен csrf был доступен, но не знал, как это сделать с последним выпуском Boot. Я также пытался использовать CommonsMultipartResolver безуспешно.

My application.yml содержит следующее:

spring:
  servlet:
    multipart:
      enabled: true
      file-size-threshold: 0B
      location: ${java.io.tmpdir}
      max-file-size: 500MB
      max-request-size: 500M

и

server:
  tomcat:
    max-swallow-size: -1

My AccessDeniedHandlerперехватывает InvalidCsrfTokenException и перенаправляет на страницу с ошибкой. Я ожидал, что токен csrf будет доступен в соответствующее время, чтобы исключение не происходило.

Обновление # 1

Я установил spring.security.filter.order = 5 и добавил следующий код, но проблема сохраняется:

public MultipartFilter multipartFilter() {
  MultipartFilter multipartFilter = new MultipartFilter();
  multipartFilter.setMultipartResolverBeanName("multipartResolver");
  return multipartFilter;
}

@Bean
public FilterRegistrationBean<MultipartFilter> registerMultipartFilter(final MultipartFilter filter) {
  final FilterRegistrationBean<MultipartFilter> reg = new FilterRegistrationBean<MultipartFilter>(filter);
  reg.setOrder(Ordered.HIGHEST_PRECEDENCE);
  return reg;
}

Но проблема все еще сохраняется.

Обновление # 2

Я решил проблему с помощью следующего:

Добавление следующего в мою конфигурацию:

@Bean
  public MultipartFilter multipartFilter() {
    MultipartFilter multipartFilter = new MultipartFilter();
    multipartFilter.setMultipartResolverBeanName("multipartResolver");
    return multipartFilter;
  }

  @Bean
  public FilterRegistrationBean<MultipartFilter> registerMultipartFilter(final MultipartFilter filter) {
    final FilterRegistrationBean<MultipartFilter> reg = new FilterRegistrationBean<MultipartFilter>(filter);
    reg.setOrder(0);
    return reg;
  }

  @Bean
  public FilterRegistrationBean<HiddenHttpMethodFilter> registerHiddenHttpMethodFilter(final HiddenHttpMethodFilter filter) {
    final FilterRegistrationBean<HiddenHttpMethodFilter> reg = new FilterRegistrationBean<HiddenHttpMethodFilter>(filter);
    reg.setOrder(1);
    return reg;
  }

Установка следующих свойств:

spring:
  security:
    filter:
      order: 5
  servlet:
    multipart:
      enabled: true
      file-size-threshold: 0B
      location: ${java.io.tmpdir}
      max-file-size: 500MB
      max-request-size: 500MB
      resolve-lazily: true

И включая токен csrfв качестве параметра запроса и перехвата результирующего MaxUploadSizeExceededException в обработчике исключений.

Мне не нравится добавлять токен csrf в запрос, но это единственное решение, которое я нашел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...