На этой лекции мы:
- Настроим 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
}
}
JSON Web Token (JWT): что это и зачем?
JWT — это стандарт, который используется для передачи данных между клиентом и сервером в зашифрованном формате. Это как закрытый сейф с паролем: кто имеет ключ (секретный ключ), тот может "открыть" и прочитать его содержимое.
Каждый JWT состоит из трех частей:
- Header (заголовок) — информация о типе токена и алгоритме шифрования.
- Payload (полезная нагрузка) — здесь хранятся данные пользователя (ID, роли).
- 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.
Реализация эндпоинтов для аутентификации
Теперь создадим контроллер, который будет генерировать 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. Теперь ваше приложение стало на порядок безопаснее.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ