Spring Security: назначение и архитектура
Spring Security — это фреймворк, обеспечивающий аутентификацию (вход) и авторизацию (проверку прав) пользователей.
Основная идея:
каждый запрос проходит через цепочку фильтров (SecurityFilterChain),
где проверяется, кто делает запрос и имеет ли он право его выполнить.
Главные задачи:
• Защита веб-приложений и REST API
• Управление пользователями и ролями
• Работа с токенами (JWT, OAuth2)
• Поддержка форм входа, Basic Auth и API-токенов
Подробное объяснение
Spring Security — стандартный инструмент защиты приложений в экосистеме Spring.
Он встроен во многие стартеры (в частности, spring-boot-starter-security)
и автоматически добавляет базовую защиту, даже если вы ее не настраивали.
1. Основные понятия
Термин Значение
Аутентификация (Authentication) Проверка личности пользователя — кто он.
Авторизация (Authorization) Проверка прав доступа — что он может делать.
UserDetails Интерфейс, описывающий пользователя (логин, пароль, роли).
SecurityContext Объект, хранящий информацию о текущем пользователе.
SecurityFilterChain Последовательность фильтров, через которые проходит каждый HTTP-запрос.
2. Как работает Spring Security (пошагово)
Пользователь отправляет запрос (например, POST /login).
Запрос попадает в цепочку фильтров безопасности (SecurityFilterChain).
Один из фильтров (например, UsernamePasswordAuthenticationFilter) проверяет логин и пароль.
Если данные верны, создается объект Authentication и сохраняется в SecurityContext.
При последующих запросах система использует этот контекст, чтобы проверить, разрешен ли доступ к ресурсу.
Если пользователь не аутентифицирован или не имеет нужной роли — возвращается ошибка 403 Forbidden.
3. Пример работы «по умолчанию»
Если просто добавить зависимость:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
— приложение сразу становится защищенным:
все HTTP-запросы требуют входа в систему.
Spring автоматически создает временного пользователя с именем user и случайным паролем,
который выводится в консоль при запуске приложения.
Using generated security password: 1b9a4a2f-4df0-4c21-8a0c-431f6b2d1a1c
Теперь при обращении к любому эндпоинту в браузере появится стандартная форма логина.
Это встроенное поведение, которое можно заменить своей конфигурацией.
4. Цепочка фильтров безопасности
Каждый HTTP-запрос проходит через набор фильтров, образующих цепочку (SecurityFilterChain).
Каждый фильтр решает свою задачу — проверяет токен, логин, права доступа и т. д.
Если хотя бы один фильтр «забракует» запрос, выполнение дальше не идет.
Упрощенно:
Request
|
[SecurityContextPersistenceFilter]
|
[UsernamePasswordAuthenticationFilter]
|
[AuthorizationFilter]
|
[ExceptionTranslationFilter]
|
[FilterSecurityInterceptor]
|
Controller
Эта структура позволяет гибко настраивать уровни защиты.
Например, вы можете разрешить доступ к /public/**, но требовать авторизацию для /admin/**.
5. Простая настройка безопасности
Современный способ конфигурации (Spring Boot 3 / Security 6):
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll()
.requestMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated())
.formLogin(Customizer.withDefaults())
.build();
}
}
Здесь:
/public/** — доступно всем,
/admin/** — только пользователям с ролью ADMIN,
остальные запросы требуют аутентификации.
Метод formLogin() включает стандартную HTML-страницу входа.
6. Архитектура в целом
Spring Security основан на фильтрах, контексте и поставщиках аутентификации:
каждый фильтр отвечает за свой этап проверки;
контекст хранит информацию о текущем пользователе;
поставщики (AuthenticationProvider) реализуют конкретные способы входа (по логину/паролю, через токен и т. д.).
Вывод:
Spring Security добавляет многоуровневую систему защиты без ручной проверки прав.
Основная идея — все запросы проходят через фильтры,
а информация о пользователе хранится в SecurityContext.
Вы можете гибко управлять доступом к эндпоинтам и настраивать собственные механизмы аутентификации.
