Ответ
Основным механизмом была аутентификация на основе JWT (JSON Web Tokens) с использованием Spring Security для авторизации.
Архитектурный выбор JWT:
- Stateless: Сервер не хранит состояние сессии, что упрощает масштабирование.
- Самоописываемость: Токен содержит claims (утверждения) с данными пользователя и ролями.
- Микросервисы: Идеально подходит для распределенных систем, так как токен можно проверять на любом сервисе.
Ключевые этапы работы:
- Аутентификация: Пользователь логинится, сервер проверяет учетные данные и генерирует JWT.
- Хеширование паролей: Для хранения паролей использовался алгоритм bcrypt.
- Авторизация: Spring Security проверяет JWT и права доступа (роли) для защиты эндпоинтов.
Пример генерации и валидации JWT с использованием библиотеки jjwt:
// Генерация токена после успешного входа
String token = Jwts.builder()
.setSubject(username) // Идентификатор пользователя
.claim("roles", roles) // Список ролей пользователя
.setExpiration(new Date(System.currentTimeMillis() + 86400000)) // Срок жизни 24 часа
.signWith(SignatureAlgorithm.HS512, secretKey) // Подпись секретным ключом
.compact();
// Валидация и извлечение данных из токена в фильтре
Claims claims = Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(token)
.getBody();
String username = claims.getSubject();
List<String> roles = claims.get("roles", List.class);