Давай подивимося правді в очі: будь-який функціонал застосунку стає вразливим без захисту. Щоб захистити застосунок нам потрібен Spring Security — потужний і гнучкий фреймворк для впровадження безпеки в твої застосунки.
Ось що він робить:
- Аутентифікація: перевірка, що користувач — це саме той, за кого себе видає.
- Авторизація: перевірка, що користувач має дозвіл виконувати певні дії або доступ до даних.
- Захист ресурсів: контроль доступу на рівні URL-адрес, методів і навіть даних.
Spring Security виріс із проєкту Acegi Security (так його раніше звали) у повноцінний фреймворк і став частиною екосистеми Spring Framework. Його інструменти для забезпечення безпеки легко інтегрувати і кастомізувати під практично будь-який проєкт.
Основні завдання Spring Security
Пройдемося по основним завданням, які вирішує цей представник сімейства Spring.
1. Аутентифікація
Припустимо, ти заходиш на сайт, вводиш логін і пароль, а після цього система дозволяє тобі керувати своїми даними. Це і є аутентифікація — процес перевірки твоєї особи.
Spring Security підтримує:
- Форми входу з логіном і паролем
- Basic Authentication (так-так, той самий логін/пароль з діалогу браузера)
- OAuth2 і OpenID Connect для соціальних входів
- JWT (JSON Web Token) для API
2. Авторизація
Уяви, що ти увійшов в систему як менеджер, але намагаєшся отримати доступ до закритого розділу, доступного тільки адміністраторам. Нічого не вийде, якщо в твого акаунта недостатньо прав. Це називається авторизація — визначення, що ти можеш робити.
Spring Security надає:
- Механізм управління ролями (RBAC — Role-Based Access Control)
- Політику доступу не тільки до веб-сторінок, але й до методів і даних
3. Захист ресурсів
Твої ресурси можуть бути як відкритими (наприклад, публічна сторінка входу), так і захищеними (особистий кабінет, API). Spring Security дозволяє легко розділяти цей доступ.
З його допомогою ти можеш:
- Визначати публічні і захищені URL
- Обмежувати доступ до ресурсів залежно від ролей
- Додавати SSL/TLS для захисту передачі даних
Навіщо використовувати Spring Security?
А тепер найцікавіше: чому Spring Security? Як завжди, якщо справа стосується Spring, відповідь проста: це спрощує і пришвидшує твою роботу. Звісно, ти можеш по-старинці вручну перевіряти на кожному методі, що користувач аутентифікований, і його роль відповідає вимогам. Але робити так — це все одно що ремонтувати машину, використовуючи лише скотч і викрутку, коли є ящик з прекрасними спеціалізованими інструментами. Просто розпакуй, розберися і користуйся.
Spring Security можна порівняти з LEGO. Хочеш побудувати базовий захист? Використовуй готові блоки. Потрібна особлива система безпеки? Створи унікальні компоненти з наявних блоків!
Додати нову систему авторизації або підключити JWT так само просто, як защіпнути нові деталі в конструктор. А найбільше приємне — Spring Security ідеально вбудовується в сім’ю Spring, ніби вони все життя працювали разом.
Як працює Spring Security?
Spring Security діє як "ланцюговий пес", який стоїть на вході в твій застосунок. Ну або консьєрж в гуртожитку. Він перехоплює запити, перевіряє, чи має користувач доступ, і або пропускає його далі, або повертає помилку.
[Клієнт] ---> [Spring Security Filter Chain] ---> [Контролер/Ресурс]
Основні кроки:
- Фільтри (Filters): Spring Security використовує ланцюжок фільтрів (Filter Chain), щоб перехоплювати запити і перевіряти їхню безпеку. Наприклад, перевіряти, чи містить запит коректний токен, або чи вводив користувач правильний пароль.
- AuthenticationManager: це інтерфейс в Spring Security, який керує процесом аутентифікації. Це компонент, який викликається з фільтрів, коли потрібно перевірити достовірність користувача (наприклад, звірити логін і пароль з базою даних).
- AccessDecisionManager: інтерфейс Spring Security. Він приймає рішення про доступ: чи може аутентифікований користувач виконати конкретну дію, враховуючи його ролі і права.
Приклад: налаштування базової безпеки
Давай спробуємо на практиці відчути міць Spring Security. Для цього створимо простий веб-застосунок з базовою аутентифікацією.
1. Додамо залежність в pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Цей магічний рядок додає в проєкт весь необхідний функціонал Spring Security.
2. Запустимо застосунок і спробуємо відкрити будь-який URL
Якщо ти нічого не налаштував, Spring Security вже увімкнений за замовчуванням і захищає всі запити. При спробі відкрити будь-який URL браузер запропонує тобі ввести логін і пароль. Однак звідки Spring Security знає ці дані?
Spring Security автоматично створює користувача з іменем user і згенерованим паролем, який можна знайти в логах при старті застосунку:
Using generated security password: [випадковий_пароль]
3. Налаштуємо власний логін/пароль
Тепер зробимо застосунок трохи дружелюбнішим. Перевизначимо аутентифікацію зі своїм логіном і паролем через application.properties:
spring.security.user.name=admin
spring.security.user.password=admin123
4. Налаштуємо доступ до різних URL
Створимо просту кастомну конфігурацію:
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll() // доступ для всіх
.antMatchers("/admin/**").hasRole("ADMIN") // тільки для адмінів
.anyRequest().authenticated() // всі інші мають бути аутентифіковані
.and()
.formLogin(); // використовуємо форму логіна
}
}
Що тут відбувається:
antMatchers("/public/**").permitAll()каже, що доступ доpublicвідкритий для всіх.antMatchers("/admin/**").hasRole("ADMIN")обмежує доступ тільки для користувачів з роллюADMIN.anyRequest().authenticated()вимагає аутентифікації для всіх інших запитів.
Практичне застосування
У реальному житті, Spring Security — це необхідний інструмент для всіх веб-застосунків. Хочеш захистити свій REST API? Використовуй JWT. Хочеш безпечний вхід для користувача з двофакторною аутентифікацією? Spring Security знову допоможе. Більшість компаній очікують, що розробник добре розуміє основи безпеки, а Spring Security покриває майже всі сценарії.
З його знаннями ти зможеш:
- Захищати свої застосунки від несанкціонованого доступу.
- Інтегруватися з сучасними системами безпеки, такими як OAuth2 і OpenID Connect.
- Досить впевнено говорити на співбесіді про безпеку застосунків.
У наступній лекції ми зануримося в поняття аутентифікації і авторизації глибше. Підготуйся до того, щоб не тільки впізнавати "хто ти", але й перевіряти, що ти можеш робити в застосунку!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ