JavaRush /Курси /Модуль 5. Spring /Лекція 107: OAuth2 з використанням Spring Security

Лекція 107: OAuth2 з використанням Spring Security

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

Коли думаєш про безпеку в розподілених системах або мікросервісах, хочеться, щоб це було уніфіковано, масштабовано й зручно в управлінні. OAuth2 дає централізований підхід до аутентифікації, дозволяючи делегувати авторизацію стороннім провайдерам (наприклад, Google, GitHub). З Spring Security можна налаштувати усе це з мінімумом зусиль завдяки потужній інтеграції — зараз розберемося, як.


Ключові особливості OAuth2 зі Spring Security

Перш ніж почнемо копатися в коді, давайте швидко пройдемося, що отримаємо завдяки інтеграції OAuth2 зі Spring Security:

  1. Уніфікація аутентифікації: більше не треба реалізовувати власний механізм входу й перевірки користувачів. Можна використовувати готові рішення від Google, GitHub та інших популярних сервісів.
  2. Обмін токенами: OAuth2 дозволяє отримувати access токени і Refresh токени, які потім використовуються для захисту ресурсів.
  3. Гнучкість ролей і прав доступу: легко керувати ролями користувачів і захищати ресурси на їхній основі.

Налаштування Spring Security для роботи з OAuth2

1. Додавання залежностей

Спочатку потрібно підключити потрібні залежності у ваш pom.xml (якщо використовуєте Maven) або build.gradle (якщо користуєтесь Gradle). Для роботи з OAuth2 у Spring Security додайте такі залежності:

Maven:


<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Gradle:


implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'org.springframework.boot:spring-boot-starter-security'

2. Конфігурація OAuth2 клієнта

Spring Boot вже чудово працює з OAuth2 провайдерами, такими як Google і GitHub, тому налаштування максимально просте. Все, що потрібно — додати конфіг у файл application.yml:


spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: YOUR_GOOGLE_CLIENT_ID
            client-secret: YOUR_GOOGLE_CLIENT_SECRET
            scope:
              - email
              - profile
            redirect-uri: "{baseUrl}/login/oauth2/code/google"
            client-name: Google
        provider:
          google:
            authorization-uri: https://accounts.google.com/o/oauth2/v2/auth
            token-uri: https://oauth2.googleapis.com/token
            user-info-uri: https://openidconnect.googleapis.com/v1/userinfo
Важливо:

Не забудь замінити YOUR_GOOGLE_CLIENT_ID і YOUR_GOOGLE_CLIENT_SECRET на свої значення. Отримати їх можна, зареєструвавши додаток у Google Cloud Console.

3. Налаштування контролера

Після конфігурації треба переконатися, що користувача перенаправляють на сторінку входу OAuth2. Spring Security робить це автоматично, але контролер потрібен для перевірки авторизації.

Створимо тестовий контролер:


@RestController
public class HelloController {

    @GetMapping("/")
    public String home(@AuthenticationPrincipal OAuth2User principal) {
        String email = principal.getAttribute("email");
        return "Привіт, " + email + "! Ти успішно автентифікований.";
    }
}

Тут ми використали анотацію @AuthenticationPrincipal, щоб отримати об'єкт поточного користувача з контексту безпеки.


Як це працює?

Ось схема взаємодії з OAuth2 провайдером на практиці:

  1. Користувач натискає кнопку входу на вашому сайті.
  2. Його перенаправляють на сторінку авторизації провайдера (наприклад, Google).
  3. Після успішного входу провайдер повертає токен.
  4. Ваш додаток використовує токен для доступу до даних користувача (наприклад, ім'я або email).

Захист ресурсів за допомогою ролей

Припустимо, потрібно обмежити доступ до певних ресурсів тільки для конкретних ролей. Ось як це можна зробити:

1. Додайте фільтр безпеки в конфігурацію Spring Security

Створіть клас налаштувань безпеки:


@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/", "/login").permitAll()
                .anyRequest().authenticated()
            .and()
            .oauth2Login(); // Включаємо OAuth2 для логіну
    }
}

2. Працюємо з ролями користувачів

За замовчуванням Spring Security дозволяє використовувати кастомні ролі. Переконайся, що твій OAuth2 провайдер їх повертає. Якщо ні — можна розширити функціональність через кастомний маппер:


@Component
public class CustomOAuth2UserService implements OAuth2UserService<OAuth2UserRequest, OAuth2User> {

    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
        OAuth2User oAuth2User = new DefaultOAuth2UserService().loadUser(userRequest);

        // Додаємо роль "USER" всім автентифікованим користувачам
        List<GrantedAuthority> authorities = new ArrayList<>(oAuth2User.getAuthorities());
        authorities.add(new SimpleGrantedAuthority("ROLE_USER"));

        return new DefaultOAuth2User(authorities, oAuth2User.getAttributes(), "name");
    }
}

За допомогою такого підходу можна додавати свої ролі користувачам, наприклад, на основі даних від OAuth2 провайдера.


Практичне завдання

  1. Налаштуй Spring Boot додаток для аутентифікації через Google.
  2. Реалізуй контролер, який повертає привітальне повідомлення з email автентифікованого користувача.
  3. Обмеж доступ до певних URL тільки для користувачів з роллю "ADMIN".

Часті питання і типові помилки

  • Отримую помилку "invalid_client" при вході через Google. Перевір, чи правильно вказані client-id і client-secret. Також переконайся, що redirect URL збігається з тим, що вказаний у Google Cloud Console.
  • OAuth2 ігнорує роль, вказану в налаштуванні. Переконайся, що провайдер віддає ролі в відповіді. Якщо ні — використовуй кастомний OAuth2UserService.
  • Токен швидко закінчується. Це може бути через налаштування часу життя токена у провайдера. Розглянь використання Refresh токенів для оновлення доступу.

На цьому все для цієї лекції. Ти дізнався, як налаштувати OAuth2 у Spring Security, аутентифікувати користувачів через сторонні сервіси (Google, GitHub) і захистити ресурси з використанням ролей. У наступних лекціях заглибимося в роботу JWT, Refresh токенів і налаштування мікросервісів. Побачимось!

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