Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

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/posts
HTTP/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 и пароль.

Что дальше

Один пользователь со случайным паролем годится только для первого знакомства. В следующих уроках мы:

  1. Будем хранить пользователей блога в базе с зашифрованными паролями.
  2. Откроем чтение статей для всех, а изменения — только для вошедших.
  3. Сделаем свою страницу входа для сайта.

Консоль /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 эту защиту отключают — в уроке о правилах доступа.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.