AuthenticationEntryPoint в Spring Security
Проблема: 403 вместо 401
Spring Security по умолчанию отдаёт 403 (Forbidden) для неаутентифицированных запросов. Это происходит потому что:
- JWT-токен не прошёл валидацию (или отсутствует)
Authenticationне установлен вSecurityContext- Запрос считается анонимным
- Без настроенного
AuthenticationEntryPointSpring отдаёт 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).
См. также
- JWT vs UserDetailsService — почему JWT использует Authentication напрямую