Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Java: Spring Security, Filter Chain, Authentication, Authorization, Security Context

Какие этапы проходит запрос в Spring Security?

Этот вопрос проверяет понимание внутреннего механизма обработки запросов в Spring Security, что необходимо для отладки и настройки аутентификации и авторизации в приложениях.

Короткий ответ

Запрос в Spring Security проходит через цепочку фильтров (Filter Chain). Сначала фильтры проверяют запрос на наличие токенов или сессий для аутентификации. Затем создается объект Authentication, который помещается в SecurityContext. После успешной аутентификации фильтры авторизации проверяют права пользователя на доступ к ресурсу. Если проверки пройдены, запрос передается в контроллер, иначе возвращается ошибка 401 или 403.

Длинный ответ

Когда HTTP-запрос поступает в приложение Spring, он в первую очередь обрабатывается цепочкой фильтров безопасности (Security Filter Chain), которая является ядром Spring Security. Эта цепочка состоит из нескольких фильтров, каждый из которых отвечает за свою часть процесса обеспечения безопасности, например, за проверку аутентификации или авторизацию.

Основные этапы обработки запроса

  • Захват запроса фильтрами: Запрос последовательно проходит через фильтры в цепочке. Важные фильтры включают UsernamePasswordAuthenticationFilter для формовой аутентификации, BasicAuthenticationFilter для Basic Auth или BearerTokenAuthenticationFilter для JWT.
  • Аутентификация: Соответствующий фильтр пытается извлечь учетные данные (например, из заголовка Authorization или куки сессии) и создать объект Authentication. Этот объект передается в AuthenticationManager, который делегирует проверку подлинности провайдеру (AuthenticationProvider), например, загрузчику пользователей из базы данных.
  • Создание SecurityContext: Если аутентификация успешна, созданный аутентифицированный объект Authentication помещается в SecurityContext, который обычно хранится в ThreadLocal и становится доступным для всей цепочки обработки данного запроса.
  • Авторизация: После аутентификации фильтр FilterSecurityInterceptor (или аналогичный) проверяет, имеет ли пользователь с данной аутентификацией необходимые права (роли или разрешения) для доступа к запрашиваемому эндпоинту, сверяясь с конфигурацией HttpSecurity.
  • Обработка исключений: Фильтр ExceptionTranslationFilter обрабатывает исключения безопасности (например, AccessDeniedException или AuthenticationException), переводя их в HTTP-ответы 403 (Forbidden) или 401 (Unauthorized).
  • Передача в контроллер: Если все проверки пройдены, запрос передается далее по цепочке фильтров и в конечном итоге достигает диспетчера сервлетов (DispatcherServlet) и вашего контроллера Spring MVC.

Пример конфигурации и код

Рассмотрим простую конфигурацию, которая показывает, как задаются правила доступа и подключается цепочка фильтров.

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authz -> authz
                .requestMatchers("/public/**").permitAll() // Этап авторизации: публичный доступ
                .requestMatchers("/admin/**").hasRole("ADMIN") // Проверка роли
                .anyRequest().authenticated() // Все остальные запросы требуют аутентификации
            )
            .formLogin(form -> form // Подключает фильтр для формовой аутентификации
                .loginPage("/login")
                .permitAll()
            )
            .addFilterBefore(new CustomFilter(), UsernamePasswordAuthenticationFilter.class); // Пример добавления своего фильтра в цепочку
        return http.build(); // Создает SecurityFilterChain
    }

    @Bean
    public AuthenticationManager authManager(UserDetailsService userDetailsService) {
        var authProvider = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(userDetailsService); // Провайдер для аутентификации
        authProvider.setPasswordEncoder(passwordEncoder());
        return new ProviderManager(authProvider);
    }
}

В этом примере видно, как конфигурация HttpSecurity определяет, какие фильтры будут в цепочке и какие правила авторизации они будут применять. Пользовательский фильтр CustomFilter добавляется перед стандартным фильтром аутентификации, что позволяет выполнить дополнительную логику (например, логирование) на раннем этапе.

Вывод: Понимание этапов запроса в Spring Security критически важно для правильной настройки безопасности приложения, отладки проблем с доступом и реализации кастомной логики аутентификации или авторизации путем внедрения собственных фильтров в цепочку.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Java

    Java

  • Spring

    Spring

Ключевые слова

#Spring Security

#Filter Chain

#Authentication

#Authorization

#Security Context

Подпишись на Java Developer в телеграм