JavaRush /Курси /Модуль 5. Spring /Лекція 156: Реалізація безпеки за допомогою Spring Securi...

Лекція 156: Реалізація безпеки за допомогою Spring Security і JWT

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

У цій лекції ми:

  • Налаштуємо Spring Security для захисту вашого додатка.
  • Підключимо й налаштуємо JWT для аутентифікації.
  • Реалізуємо перевірку токенів і правила доступу для API.
  • Навчимося, як генерувати і валідовувати JWT токени.

Налаштування Spring Security

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

Підключення залежності

Якщо ви використовуєте Maven, додайте у pom.xml таку залежність:


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

Якщо ви користуєтесь Gradle:


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

Створення базового класу конфігурації

Створимо конфігураційний клас для Spring Security:


@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable() // Вимикаємо CSRF для REST API
            .authorizeRequests()
                .antMatchers("/api/auth/**").permitAll() // Дозволяємо доступ до API автентифікації
                .anyRequest().authenticated() // Усі інші запити потребують автентифікації
            .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); // JWT = Stateless
    }
}
Конфігурація безпеки Spring у новому світі — це як рецепт. Потрібно буквально описати, як і що має працювати.

JSON Web Token (JWT): що це і навіщо?

JWT — це стандарт, який використовується для передачі даних між клієнтом і сервером у зашифрованому форматі. Це як зачинений сейф із паролем: хто має ключ (секретний ключ), той може "відкрити" і прочитати його вміст.

Кожен JWT складається з трьох частин:

  1. Header (заголовок) — інформація про тип токена і алгоритм шифрування.
  2. Payload (полезная нагрузка) — тут зберігаються дані користувача (ID, ролі).
  3. Signature (подпись) — використовується для перевірки достовірності токена.

Генерація JWT-токенів

Для роботи з JWT ми будемо використовувати бібліотеку jjwt. Підключіть її у вашому pom.xml:


<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.11.5</version>
</dependency>

Тепер створимо утилітний клас для роботи з токенами.


import io.jsonwebtoken.*;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class JwtTokenUtil {

    private final String SECRET_KEY = "secret"; // Використовуйте більш складний ключ!

    public String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username) // Встановлюємо користувача
                .setIssuedAt(new Date()) // Дата випуску токена
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // Через 10 годин термін дії токена закінчується
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY) // Алгоритм шифрування
                .compact();
    }

    public String extractUsername(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }

    public boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
            return true;
        } catch (JwtException | IllegalArgumentException e) {
            return false; // Токен недійсний
        }
    }
}

Додавання фільтра для перевірки токенів

Тепер напишемо фільтр, який оброблятиме кожен запит і перевірятиме валідність JWT.

Додайте цей фільтр у ланцюжок Spring Security.

Реалізація ендпоінтів для автентифікації

Тепер створимо контролер, який генеруватиме JWT токени:


@RestController
@RequestMapping("/api/auth")
public class AuthController {

    private final JwtTokenUtil jwtTokenUtil;

    public AuthController(JwtTokenUtil jwtTokenUtil) {
        this.jwtTokenUtil = jwtTokenUtil;
    }

    @PostMapping("/login")
    public ResponseEntity
    createAuthenticationToken(@RequestBody AuthRequest authRequest) {
        // Тут ви можете додати логіку перевірки користувачів (наприклад, через базу!)
        String token = jwtTokenUtil.generateToken(authRequest.getUsername());
        return ResponseEntity.ok(new AuthResponse(token));
    }
}

class AuthRequest {
    private String username;
    private String password;

    // геттери/сеттери
}

class AuthResponse {
    private final String token;

    public AuthResponse(String token) {
        this.token = token;
    }

    public String getToken() {
        return token;
    }
}

Підсумки: що ми зробили?

Ми налаштували Spring Security, реалізували JWT-токени й додали базовий захист вашого REST API. Тепер ваш додаток став значно безпечнішим.

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