JavaRush /Курси /Модуль 5. Spring /Вступ до Spring Security

Вступ до Spring Security

Модуль 5. Spring
Рівень 17 , Лекція 0
Відкрита

Давай подивимося правді в очі: будь-який функціонал застосунку стає вразливим без захисту. Щоб захистити застосунок нам потрібен Spring Security — потужний і гнучкий фреймворк для впровадження безпеки в твої застосунки.

Ось що він робить:

  1. Аутентифікація: перевірка, що користувач — це саме той, за кого себе видає.
  2. Авторизація: перевірка, що користувач має дозвіл виконувати певні дії або доступ до даних.
  3. Захист ресурсів: контроль доступу на рівні 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] ---> [Контролер/Ресурс]

Основні кроки:

  1. Фільтри (Filters): Spring Security використовує ланцюжок фільтрів (Filter Chain), щоб перехоплювати запити і перевіряти їхню безпеку. Наприклад, перевіряти, чи містить запит коректний токен, або чи вводив користувач правильний пароль.
  2. AuthenticationManager: це інтерфейс в Spring Security, який керує процесом аутентифікації. Це компонент, який викликається з фільтрів, коли потрібно перевірити достовірність користувача (наприклад, звірити логін і пароль з базою даних).
  3. 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 покриває майже всі сценарії.

З його знаннями ти зможеш:

  1. Захищати свої застосунки від несанкціонованого доступу.
  2. Інтегруватися з сучасними системами безпеки, такими як OAuth2 і OpenID Connect.
  3. Досить впевнено говорити на співбесіді про безпеку застосунків.

У наступній лекції ми зануримося в поняття аутентифікації і авторизації глибше. Підготуйся до того, щоб не тільки впізнавати "хто ти", але й перевіряти, що ти можеш робити в застосунку!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ