JwtFilter в Spring Security

JWT-фильтр встраивается в Spring Security filter chain и проверяет токен на каждый входящий HTTP-запрос.

Базовый класс

Фильтр наследуется от OncePerRequestFilter, который гарантирует однократное выполнение на запрос (в отличие от GenericFilterBean, который может сработать повторно при forward/include).

public class JwtFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(
            HttpServletRequest request,
            HttpServletResponse response,
            FilterChain fc) throws IOException, ServletException {
        // логика фильтрации
    }
}

Алгоритм работы

  1. Извлечь токен из заголовка Authorization (убрать префикс Bearer )
  2. Проверить валидность токена (подпись, срок действия)
  3. Извлечь Claims и создать объект JwtAuthentication
  4. Поместить объект в SecurityContextHolder
  5. Передать запрос дальше по цепочке фильтров

Если токен отсутствует или невалиден — фильтр просто пропускает запрос дальше. Spring Security сам вернёт 401 через AuthenticationEntryPoint, если эндпоинт требует аутентификации.

Регистрация в SecurityFilterChain

Фильтр добавляется после UsernamePasswordAuthenticationFilter:

.addFilterAfter(jwtFilter, UsernamePasswordAuthenticationFilter.class)

Важные детали

  • Фильтр работает на уровне Servlet filter chain, до контроллеров — поэтому @ControllerAdvice не перехватывает исключения из фильтра
  • В Spring Boot 3.x используются пакеты jakarta.servlet вместо javax.servlet
  • Фильтр не должен бросать исключения при невалидном токене — он просто не устанавливает Authentication

См. также