Auth Service — BR 1.4.3
Репо: erp-auth-service (C:\Users\A211\Desktop\erp-auth-service)
Контракт: API + Data Model
Зависимости
Требуется готовый User Service (минимум Фаза 6 — internal endpoint
/internal/users/{id}/permissions).
Фаза 1 — JWT payload
- В
JwtTokenProvider.generate(user)— добавить claimrole_ids(List). Source: поле role_idsиз User Service response - Parser — десериализовать
role_idsиз JWT - Обновить
JwtUser/UserPrincipal— добавитьList<UUID> roleIds
Фаза 2 — Redis-кэш user_permissions:{user_id}
- Клиент Redis — использовать существующий (
RedisTemplateили Lettuce) -
UserPermissionsCacheservice:getFromCache(userId): Optional<CachedPermissions>loadAndCache(userId): CachedPermissions— вызывает User ServiceGET /internal/users/{id}/permissions, сохраняет в Redis с TTL 60 секgetOrLoad(userId): CachedPermissions— единая точка входа с cache-aside
- DTO
CachedPermissions { roleIds: List<UUID>, permissions: List<String> }— Jackson-сериализуемый
Фаза 3 — POST /internal/auth/validate — расширение
- В
ValidateController/AuthInternalService.validate(token):- После валидации JWT — получить
permissionsиrole_idsчерезUserPermissionsCache.getOrLoad(userId) - Response body дополнить полями
role_ids[]иpermissions[]
- После валидации JWT — получить
- Не ломать обратную совместимость — существующие поля (
role,franchise_id,store_ids,legal_entity_id) остаются
Фаза 4 — POST /auth/login — расширение
- В
AuthController.loginпосле успешной валидации credentials:- Получить
role_ids[]+permissions[]из User Service response (полe уже расширено в User Service Фаза 6) - Положить в JWT (role_ids) и в Redis-кэш user_permissions
- Response
userдополнитьrole_ids[]иpermissions[]
- Получить
Фаза 5 — Новый GET /auth/me
-
AuthController.me()— authenticated endpoint (Bearer JWT) - Извлечь userId из
UserPrincipal - Получить user profile через User Service (новый или существующий endpoint
GET /internal/users/{id}) — с полями (id, email, first_name, last_name, role, franchise_id, store_ids, legal_entity_id) - Получить roles[] (с name, is_system, store_ids) и permissions[] через agregator
- Response:
{ "data": { "user": { ... }, "roles": [ { id, name, is_system, store_ids } ], "permissions": [ ... ] } }
Фаза 6 — User Service Client
- Расширить
UserServiceClientметодомgetPermissions(userId): CachedPermissions - Покрыть retries / timeouts / circuit breaker как у остальных internal-вызовов
Фаза 7 — Тесты
- Unit:
UserPermissionsCache— cache hit/miss/expiry, загрузка из User Service (mock) - Integration:
/internal/auth/validateс реальным JWT и Redis Testcontainer — проверка кэш-хита на втором вызове - Integration:
/auth/me— возврат полного профиля для разных ролей
Выходные критерии
- Все изменения обратно совместимы (существующие JWT без
role_idsне ломаются —role_ids = []или null parsing) - Redis TTL 60 сек подтверждён (можно задать через
application.yml: auth.permissions-cache.ttl-seconds: 60) - Тесты проходят
- Docker-сборка OK