У цій лекції ми:
- Налаштуємо 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. Тепер ваш додаток став значно безпечнішим.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ