← Назад к вопросам

Как работает Spring Security?

2.2 Middle🔥 271 комментариев
#Spring Boot и Spring Data#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как работает Spring Security

Spring Security — это мощный фреймворк для обеспечения аутентификации и авторизации в Java приложениях. Это комплексное решение, которое защищает приложение на нескольких уровнях.

Основная архитектура

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

SecurityFilterChain — это цепь фильтров, которая перехватывает все входящие запросы. Каждый фильтр выполняет определённую задачу в процессе обработки безопасности.

Authentication — процесс проверки личности пользователя. Spring Security использует объект Authentication, который содержит информацию о пользователе и его учётные данные.

Authorization — процесс проверки прав доступа уже аутентифицированного пользователя. Проверяется, может ли пользователь выполнить определённое действие.

Процесс аутентификации

// 1. Пользователь отправляет учётные данные (username/password)
// 2. UsernamePasswordAuthenticationFilter перехватывает запрос
// 3. Создаётся объект Authentication с учётными данными
UsernamePasswordAuthenticationToken token = 
  new UsernamePasswordAuthenticationToken(username, password);

// 4. AuthenticationManager пытается аутентифицировать пользователя
Authentication authenticated = authenticationManager.authenticate(token);

// 5. Если аутентификация успешна, Authentication сохраняется в SecurityContext
SecurityContextHolder.getContext().setAuthentication(authenticated);

SecurityContext и ThreadLocal

Spring Security использует ThreadLocal для хранения информации об аутентифицированном пользователе:

// Получить текущего аутентифицированного пользователя
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = auth.getName(); // имя пользователя
Collection<? extends GrantedAuthority> authorities = auth.getAuthorities(); // роли

Авторизация и управление доступом

Spring Security предоставляет несколько способов контроля доступа:

// 1. Аннотации (@Secured, @PreAuthorize, @PostAuthorize)
@PreAuthorize("hasRole(ADMIN)")
public void deleteUser(Long id) {
    // только администраторы могут вызвать этот метод
}

// 2. Конфигурация в SecurityFilterChain
@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authz -> authz
                .requestMatchers("/admin/**").hasRole("ADMIN")
                .requestMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
            )
            .httpBasic(Customizer.withDefaults());
        return http.build();
    }
}

Провайдеры аутентификации

AuthenticationManager использует AuthenticationProvider для проверки учётных данных. Например, DaoAuthenticationProvider работает с пользовательской базой данных:

@Configuration
public class SecurityConfig {
    @Bean
    public AuthenticationProvider authenticationProvider(
            UserDetailsService userDetailsService,
            PasswordEncoder passwordEncoder) {
        DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
        provider.setUserDetailsService(userDetailsService);
        provider.setPasswordEncoder(passwordEncoder);
        return provider;
    }
}

Шифрование паролей

Спringнять Security рекомендует использовать BCrypt для хеширования паролей:

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

CSRF защита

Spring Security по умолчанию защищает от CSRF атак, требуя CSRF токен для операций изменения данных (POST, PUT, DELETE).

Session и Stateless аутентификация

Session-based — Spring Security создаёт сессию на сервере, сохраняя информацию о пользователе.

Stateless (JWT) — вместо сессии используются токены, которые отправляются с каждым запросом и проверяются на валидность.

// Конфигурация для JWT
http.sessionManagement(session -> session
    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
);

Spring Security — это гибкий и мощный фреймворк, который обеспечивает многоуровневую защиту приложения, от базовой аутентификации до сложных сценариев авторизации с использованием современных методов (OAuth 2.0, SAML и т.д.).

Как работает Spring Security? | PrepBro