Гид по технологиям

Spring Security — настройка аутентификации и прав доступа

8 min read Безопасность Обновлено 24 Apr 2026
Spring Security — настройка аутентификации и прав
Spring Security — настройка аутентификации и прав

Замок на клавиатуре ноутбука

Spring Security добавляет в Spring Boot готовые механизмы аутентификации и авторизации. По умолчанию все HTTP-запросы защищены и требуют входа. Чтобы сделать детали контроля доступа гибкими, добавьте зависимость, настройте beans (PasswordEncoder, UserDetailsService, SecurityFilterChain) и опишите правила в filterChain. В статье — пошаговый пример, варианты ошибок, чек-листы для ролей и решение типичных задач.

Зачем это важно

Spring Security позволяет контролировать, кто и какие страницы или API может вызывать. Это не только защита от несанкционированного доступа, но и возможность реализовать роли и разграничение обязанностей (RBAC). Неправильная настройка может привести к утечке функций приложения или к частичной недоступности для пользователей.

Важно: аутентификация — проверка личности пользователя. Авторизация — проверка прав пользователя.

Коротко о терминах

  • Аутентификация: подтверждение личности (логин/пароль, токен).
  • Авторизация: разрешения и роли (что разрешено делать после входа).
  • Filter chain: последовательность фильтров, которую проходит HTTP-запрос.
  • UserDetailsService: сервис, который получает данные пользователя из БД или другого хранилища.

Добавление Spring Security в проект

Есть два пути: выбрать зависимость при генерации проекта через Spring Initializr или добавить её вручную в build.gradle / pom.xml.

Если вы используете Gradle, добавьте в build.gradle:

dependencies {  
    implementation 'org.springframework.boot:spring-boot-starter-security'  
}

Если Maven, добавьте в pom.xml:

  
    org.springframework.boot  
    spring-boot-starter-security  

Репозиторий примера доступен на GitHub под лицензией MIT (см. исходный проект для практики).

Быстрая проверка после добавления зависимости

Запустите приложение и откройте любую страницу, например http://localhost:8080. По умолчанию Spring Security перенаправит на /login и потребует логин и автоматически сгенерированный пароль, который выводится в консоли:

Using generated security password: c4070465-4c65-4e72-8c3f-3800e631ba81

Пароль меняется при каждом старте, имя пользователя «user» по умолчанию.

Пример простого контроллера

package com.springSecurityDemo.controller;  
  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RestController;  
  
@RestController  
public class WebController {  
    
    @GetMapping("/")  
    public String home() {  
         return "Welcome!";  
    }  
}

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

Страница входа Spring Security

ALT: Форма входа Spring Security с полями логина и пароля

Настройка проекта для примера

Для развёртывания демонстрационного приложения понадобятся дополнительные зависимости (в примере):

  • Spring Data JPA
  • MySQL JDBC Driver (или другой JDBC-драйвер по выбору)
  • Thymeleaf (рендер страниц)
  • Lombok (уменьшает шаблонный код)

Файл application.properties может выглядеть так для локальной MySQL:

spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/spring_security  
spring.datasource.username=root  
spring.datasource.password=1234  
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver  
  
spring.jpa.hibernate.ddl-auto=update

Обновите URL и учётные данные под вашу среду. Для тестов можно использовать встроенную H2-базу и поменять конфиг.

Структура представлений примера

В примере есть шесть представлений:

  • Главная страница
  • Страница регистрации
  • Страница входа
  • Страница выхода
  • Страница для авторизованного пользователя
  • Страница ошибки

Только страница пользователя требует, чтобы пользователь сначала зарегистрировался и вошёл в систему.

Контроллер регистрации

Контроллер обрабатывает запросы к /register. Он принимает данные формы, кодирует пароль и сохраняет пользователя в репозиторий.

@Controller  
@RequestMapping("/register")  
public class RegistrationController {  
     private UserRepository userRepo;  
     private PasswordEncoder passwordEncoder;  
      
     public RegistrationController(UserRepository userRepo, PasswordEncoder passwordEncoder) {  
         this.userRepo = userRepo;  
         this.passwordEncoder = passwordEncoder;  
     }  
     @GetMapping  
     public String registerForm() {  
         return "registration";  
     }  
     @PostMapping  
     public String processRegistration(RegistrationForm form) {  
         userRepo.save(form.toUser(passwordEncoder));  
         return "redirect:/login";  
     }  
}

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

Конфигурация Spring Security в Java

Начиная с Spring 3.1, конфигурацию удобно писать классами Java с аннотацией @Configuration.

@Configuration  
public class SecurityConfiguration {  
}

В конфигурации определяются необходимые beans.

PasswordEncoder

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

BCrypt — надёжный выбор для хеширования паролей. PasswordEncoder используют при регистрации и при проверке учётных данных.

UserDetailsService

@Bean  
public UserDetailsService userDetailsService(UserRepository userRepo) {  
  return username -> {  
    Customer customer = userRepo.findByUsername(username);  
    if (customer != null)  
      return customer;  
    throw new UsernameNotFoundException("Customer '" + username + "' not found");  
  };  
}

UserDetailsService предоставляет Spring Security данные пользователя (username, password, authorities).

SecurityFilterChain

Фильт-цепочка определяет правила доступа к путям и страницы логина/логаута.

@Bean  
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {  
  http  
  .authorizeHttpRequests((authorize) -> authorize  
          .requestMatchers("/user").hasAuthority("USER").anyRequest().permitAll())  
  .formLogin(formLogin -> formLogin  
          .loginPage("/login").defaultSuccessUrl("/user", true))  
  .logout(logout -> logout.logoutSuccessUrl("/logout"));               
  return http.build();  
}

В этом примере доступ к /user разрешён только пользователям с authority “USER”. Все остальные URL разрешены (permitAll).

Получение ролей в объекте пользователя

@Override  
public Collection getAuthorities() {  
  return Arrays.asList(new SimpleGrantedAuthority("USER"));  
}

Данный метод возвращает список прав (authorities), которые используются при авторизации.

Поведение фильтр-цепочки и перенаправления

filterChain отвечает за:

  • правила авторизации (какие URL защищены),
  • конфигурацию формы логина (loginPage, successUrl),
  • настройки выхода (logoutSuccessUrl).

Если пользователь успешно аутентифицирован, spring перенаправит его на defaultSuccessUrl. Если аутентификация неудачна — форма логина обновится с ошибкой.

Практические рекомендации

  • Никогда не храните пароли в открытом виде. Используйте BCrypt или другой адаптивный хеш.
  • Валидация данных на стороне сервера обязательна (email, длина пароля, уникальность).
  • Разделяйте окружения: локальная БД для разработки, отдельная для тестов и продакшн.
  • Логируйте не чувствительные события (успешный вход, неуспешная попытка) для мониторинга.

Важно: не логируйте пароли и секреты.

Когда встроенная конфигурация не подходит

Примеры ситуаций, когда нужна расширенная настройка:

  • Многоуровневые роли и сложные правила доступа (RBAC с кастомной логикой).
  • Использование OAuth2 / OpenID Connect для единого входа (SSO).
  • REST API: вместо formLogin лучше использовать JWT или OAuth2 токены.
  • Требования к аудиту и дополнительной двухфакторной аутентификации.

В таких случаях стоит комбинировать Spring Security с модулями OAuth2 / JWT или использовать внешние провайдеры аутентификации.

Альтернативные подходы

  • Для REST API часто удобнее JWT: сервер выдаёт токен, клиент хранит и отправляет в заголовке Authorization.
  • Для крупных компаний — интеграция с Identity Provider (IdP) через OAuth2/OIDC (Keycloak, Okta, Azure AD).
  • Если нужно простое разделение доступа внутри одной инстанции — можно использовать фильтры и interceptors без сложной настройки Spring Security, но это рискует повторять уязвимости.

Мини‑методология для внедрения Spring Security (шаги)

  1. Добавьте зависимость spring-boot-starter-security.
  2. Определите домен пользователей и репозиторий (User / UserRepository).
  3. Реализуйте PasswordEncoder (BCrypt).
  4. Реализуйте UserDetails / UserDetailsService для получения данных из БД.
  5. Настройте SecurityFilterChain для правил доступа и страниц логина/логаута.
  6. Покройте базовые сценарии тестами и ручными проверками.
  7. Настройте мониторинг и логи для попыток входа.

Критерии приёмки

  • Пользователь может зарегистрироваться и войти с новым аккаунтом.
  • После входа пользователь с ролью USER попадает на /user.
  • Доступ к закрытым страницам запрещён без входа (HTTP 302 -> /login или 401/403 для API).
  • Пароли хранятся в БД в виде хеша (не plaintext).
  • При рестарте приложения не используются статические пароли (если это не предусмотрено).

Чек‑листы по ролям

Разработчик:

  • Добавить PasswordEncoder и UserDetailsService.
  • Настроить SecurityFilterChain с минимальными правилами.
  • Подготовить тестовые пользователи.

DevOps / Инфраструктура:

  • Разделить конфигурации для dev/test/prod (секреты в vault).
  • Обеспечить TLS/HTTPS для передачи паролей.
  • Настроить мониторинг и оповещения по числу неудачных логинов.

Безопасник:

  • Провести ревью конфигурации SecurityFilterChain.
  • Проверить хранение паролей и политику паролей.
  • Оценить необходимость MFA и SSO.

Примеры тестовых сценариев

  • Успешная регистрация -> перенаправление на /login.
  • Успешный вход -> перенаправление на /user.
  • Попытка доступа к /user без логина -> перенаправление на /login.
  • Неверный пароль -> остаёмся на /login и показываем ошибку.

Примеры типичных ошибок и как их диагностировать

  1. Проблема: страница /user по‑прежнему недоступна после успешного входа.

    • Проверьте, что user действительно имеет authority “USER” (реализация getAuthorities).
    • Убедитесь, что defaultSuccessUrl совпадает с требуемым URL.
  2. Проблема: форма логина не отображается, получаете 403.

    • Возможно, CSRF не настроен для нестандартных форм или вы помешали стандартному обработчику.
    • Для API можно отключить CSRF или использовать токены.
  3. Проблема: приложение использует сгенерированный пароль вместо ваших пользователей.

    • Убедитесь, что UserDetailsService возвращает реальные объекты и зарегистрируйте их в контексте.

Модель зрелости контроля доступа (пример)

  • Уровень 1 — базовая защита: включён Spring Security по умолчанию (все роуты требуют логин).
  • Уровень 2 — ролевая модель: реализованы простые роли (USER, ADMIN).
  • Уровень 3 — политики: комплексные правила на основе выражений, проверки атрибутов.
  • Уровень 4 — центр идентификации: интеграция с IdP, SSO, MFA.

Стремитесь к уровню, который соответствует рискам вашего приложения.

Факто‑бокс: ключевые элементы конфигурации

  • PasswordEncoder: BCryptPasswordEncoder — рекомендовано.
  • UserDetailsService: источник правды (БД, LDAP, внешний IdP).
  • SecurityFilterChain: основные правила доступа и страницы логина.
  • CSRF: включён для web-форм, отключён / настроен для stateless API.

Риски и смягчения

  • Риск: хранение секретов в репозитории.
    Смягчение: использовать vault/keystore и environment variables.

  • Риск: неправильные правила доступа, дающие публичный доступ к защищённым данным.
    Смягчение: ревью правила и покрытие тестами, пентест.

  • Риск: отсутствие TLS.
    Смягчение: настроить HTTPS и HSTS на уровне сервера.

Security hardening — практические советы

  • Включите HTTPS во всех окружениях, где работают реальные пользователи.
  • Логируйте и отслеживайте неуспешные попытки входа.
  • Применяйте ограничение частоты запросов (rate limiting) на эндпоинты логина.
  • Внедрите MFA для чувствительных ролей.

Совместимость и миграция

  • При миграции с XML-конфигурации на Java Config перепишите определения beans и проверьте порядок фильтров.
  • При переходе на OAuth2/JWT — решите, какие endpoints останутся stateful, а какие — stateless.

Decision flow (простое дерево решений)

flowchart TD
  A[Нужна форма логина?] -->|Да| B[Использовать formLogin]
  A -->|Нет| C[REST API]
  C --> D{Нужен токен}
  D -->|Да| E[Использовать JWT/OAuth2]
  D -->|Нет| F[Basic Auth или кастомный фильтр]
  B --> G{Есть внешняя IdP}
  G -->|Да| H[Использовать OAuth2/OIDC]
  G -->|Нет| I[Использовать встроенный UserDetailsService]

Советы по локализации и UX форм логина

  • Показывайте минимальные сообщения об ошибках (не раскрывайте, существует ли логин).
  • Поддерживайте понятные подсказки при регистрации (требования к паролю).
  • Для локали России/ЕАЭС учитывайте локальные требования к хранению данных при работе с персональными данными.

Примечания по приватности (общие)

  • Соблюдайте требования к хранению персональных данных в вашей юрисдикции.
  • Шифруйте каналы передачи (HTTPS).
  • Храните только необходимые атрибуты пользователя.

Итог

Spring Security даёт мощный и гибкий каркас для аутентификации и авторизации. Для простых приложений достаточно настроить PasswordEncoder, UserDetailsService и SecurityFilterChain. Для более сложных сценариев рассмотрите OAuth2, JWT и централизованные IdP. Тестируйте, ревьюьте конфигурации и применяйте базовые практики безопасности.

Ключевые выводы:

  • Начните с простых, но безопасных настроек.
  • Кодируйте пароли и не логируйте секреты.
  • Разграничивайте роли и регулярно проверяйте правила доступа.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Изменить пароль Windows 11 — все способы
Windows

Изменить пароль Windows 11 — все способы

LED‑глаза для Хэллоуина — простой DIY
DIY

LED‑глаза для Хэллоуина — простой DIY

Интерактивная доска из Wii Remote — руководство
Образование

Интерактивная доска из Wii Remote — руководство

Как стать паранормальным исследователем
Руководство

Как стать паранормальным исследователем

Синхронизация света с музыкой для Хэллоуина
Умный дом

Синхронизация света с музыкой для Хэллоуина

Сделать фото похожим на винтаж
Фотография

Сделать фото похожим на винтаж