JavaRush /Курсы /Модуль 5. Spring /Лекция 156: Реализация безопасности с помощью Spring Secu...

Лекция 156: Реализация безопасности с помощью Spring Security и JWT

Модуль 5. Spring
16 уровень , 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. Теперь ваше приложение стало на порядок безопаснее.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ