Spring Security: первое знакомство
Сейчас любой может удалить чужую статью. Spring Security — модуль, который отвечает на два вопроса: кто пришёл (аутентификация, вход) и что ему можно (авторизация, права). Он стоит перед контроллерами цепочкой фильтров и проверяет каждый запрос до того, как тот дойдёт до вашего кода.
Подключение
<!-- pom.xml -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>Больше ничего писать не нужно, чтобы увидеть, как он работает.
Что изменилось
При запуске в журнале появится предупреждение:
WARN ... UserDetailsServiceAutoConfiguration :
Using generated security password: 823d91a9-120b-4e1f-8732-9e5dce83ab92
This generated password is for development use only. Your security configuration must be updated before running your application in production.Spring Boot создал одного пользователя с именем user и случайным паролем — он меняется при каждом запуске. А все адреса приложения закрылись:
curl -i http://localhost:8080/api/postsHTTP/1.1 401
WWW-Authenticate: Basic realm="Realm", charset="UTF-8"
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Cache-Control: no-cache, no-store, max-age=0, must-revalidateКод 401 значит «нужен вход». Заголовок WWW-Authenticate: Basic подсказывает способ: HTTP Basic — имя и пароль в заголовке запроса. Остальные заголовки Spring Security добавляет для защиты от типичных атак в браузере.
Вход через curl
Ключ -u отправляет имя и пароль способом HTTP Basic:
curl -u user:823d91a9-120b-4e1f-8732-9e5dce83ab92 "http://localhost:8080/api/posts?size=1"{"content":[{"id":2,"title":"Из формы","body":"Написано в браузере","author":"oleg","createdAt":"2026-10-04T09:02:04.450432Z"}],"page":{"size":1,"number":0,"totalElements":2,"totalPages":2}}С паролем данные пришли. В браузере http://localhost:8080/ перенаправит на встроенную страницу входа /login — там можно ввести те же user и пароль.
Что дальше
Один пользователь со случайным паролем годится только для первого знакомства. В следующих уроках мы:
- Будем хранить пользователей блога в базе с зашифрованными паролями.
- Откроем чтение статей для всех, а изменения — только для вошедших.
- Сделаем свою страницу входа для сайта.
Консоль /h2-console после подключения Spring Security тоже закрыта — смотрите базу через неё до этого шага или через тесты.
Частая ошибка
Даже с верным паролем запрос POST не проходит:
curl -i -u user:823d91a9-120b-4e1f-8732-9e5dce83ab92 -X POST http://localhost:8080/api/users \
-H "Content-Type: application/json" -d '{"username":"ivan"}'HTTP/1.1 401Причина — защита от CSRF (подделки запросов с чужого сайта): по умолчанию Spring Security требует специальный токен у всех запросов, которые что-то меняют. Отказ уходит на страницу ошибки /error, которая тоже закрыта, поэтому curl видит 401. Для API без cookie эту защиту отключают — в уроке о правилах доступа.