AuthenticationEntryPoint в Spring Security

Проблема: 403 вместо 401

Spring Security по умолчанию отдаёт 403 (Forbidden) для неаутентифицированных запросов. Это происходит потому что:

  1. JWT-токен не прошёл валидацию (или отсутствует)
  2. Authentication не установлен в SecurityContext
  3. Запрос считается анонимным
  4. Без настроенного AuthenticationEntryPoint Spring отдаёт 403 вместо 401

Почему @ControllerAdvice не работает

@ControllerAdvice перехватывает исключения только из контроллеров. JWT-фильтр работает раньше — на уровне Spring Security filter chain, до того как запрос попадёт в контроллер.

Решение

Настроить AuthenticationEntryPoint в SecurityFilterChain:

.exceptionHandling(exceptions -> exceptions
        .authenticationEntryPoint((request, response, ex) ->
                response.sendError(HttpServletResponse.SC_UNAUTHORIZED, ex.getMessage())
        )
)

Теперь при отсутствии или невалидности токена клиент получит 401 (Unauthorized).

См. также