Ошибка проверки в контроллере возвращает 401 вместо 400 - PullRequest
0 голосов
/ 06 июня 2019

У меня есть пост-конечная точка в моем контроллере отдыха, которая доступна без аутентификации / авторизации.он настраивается в WebSecurityConfigurerAdapter следующим образом:

@Override
public void configure(WebSecurity web) {
    web.ignoring().antMatchers("/api/v1/user");
}

Конечная точка имеет проверку входных данных (предоставляется аннотацией javax.validation.Valid).Когда я отправляю неверные данные, я получаю ответ 401 вместо 400. Эта проблема не существует в защищенных конечных точках, где отправляется сообщение 400 весенней загрузки по умолчанию.

Во время отладки я обнаружил, что во время обработки MethodArgumentNotValidException (которое выдается, когда в контроллере возникает ошибка проверки), WebExpressionVoter выполняется и возвращает значение -1, что означает «доступ запрещен».Как я могу настроить свое приложение на игнорирование проверок безопасности для конечных точек, которые являются общедоступными?

Я знаю, что использование ControllerAdvice для обработки исключений является одним из вариантов, но возможно ли иметь 400 сообщений по умолчанию?

Заранее благодарим за любые подсказки!

РЕДАКТИРОВАТЬ:

Security filter chain: [
  WebAsyncManagerIntegrationFilter
  SecurityContextPersistenceFilter
  HeaderWriterFilter
  LogoutFilter
  OAuth2AuthenticationProcessingFilter
  RequestCacheAwareFilter
  SecurityContextHolderAwareRequestFilter
  AnonymousAuthenticationFilter
  SessionManagementFilter
  ExceptionTranslationFilter
  FilterSecurityInterceptor
]

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Хорошо, я нашел решение. Я не знаю почему, но когда возникает исключение, появляется другой запрос POST к этому URL: / error. Когда я добавил этот URL в список игнорирования, он начал работать. Итак, моя конфигурация выглядит так:

@Override
public void configure(WebSecurity web) {
    web.ignoring().antMatchers("/api/v1/user", "/error/**")
}

@ Кен Чан, спасибо за информацию об отладочных фильтрах! Это было очень важно.

0 голосов
/ 07 июня 2019

Использование webSecurity.ignoring() приведет к тому, что запрос к этому URL полностью обойдёт всю цепочку фильтров безопасности. Интересно, что WebExpressionVoter по-прежнему использует эти игнорируемые URL.

Итак, я предполагаю следующие возможности:

  • /api/v1/user будет перенаправлен на другой защищенный URL-адрес.

  • Вы думаете, что antMatchers("/api/v1/user") будет соответствовать всем URL-адресам в /api/v1/user, например /api/v1/user/1. Тем не менее, он соответствует только /api/v1/user.

Чтобы игнорировать все URL-адреса в /api/v1/user, вы должны использовать:

 web.ignoring().antMatchers("/api/v1/user/**");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...