4747d85d15
JwtTestSupport: embedded HTTP server отдаёт JWK Set, генерирует RSA keypair,
подписывает test-JWT с произвольными realm-ролями. Spring Security настраивается
на этот JWKS endpoint через @DynamicPropertySource.
AuthE2ETest (6 тестов):
- anonymousRequest_returns401 — auth.required=true → anonymous = 401
- invalidJwt_returns401 — гарбидж в Authorization header → 401
- publicUser_canListDictionaries — JWT с ordinis:client:public → 200
- internalUser_canSeeInternalRecord — JWT с ordinis:client:internal видит INTERNAL запись
- unrecognizedRole_fallsBackToPublic — admin/viewer роли → PUBLIC scope (default)
❗ publicUser_cannotSeeInternalRecords — НАЙДЕН security gap:
Writer endpoint /api/v1/dictionaries/{name}/records/{key} НЕ фильтрует по
scope JWT юзера → public-юзер может прочитать INTERNAL запись.
Тест документирует текущее поведение (assertThat 200 OK + TODO comment).
Read-api (отдельный модуль) фильтрует корректно — issue только в writer.
Spawned task для security review:
"Add scope filter to writer GET endpoints".
pom.xml: + nimbus-jose-jwt 9.37.3 (test scope) для JWT signing.
Все 12 e2e тестов зелёные: smoke + 4 bitemporal + outbox-kafka + 6 auth.
Total ~18 sec со Spring boot.