Ledger: внешняя граница
Публичные чтения отделены от внутренних финансовых команд.
Feature: Подмена владельца счета
Scenario: Подмена владельца счета
Given пользователь без SYSTEM_ADMIN вошел со своим токеном
When ListAccounts содержит чужой userId
Then возвращается PermissionDenied
And actor из тела не влияет на проверку владельцаАлгоритм допуска
ledgerAccessInterceptor отклоняет streaming, требует Bearer и подтвержденный subject. Ошибка сервиса identity возвращает Unavailable; неверный токен — Unauthenticated. Лимит по субъекту применяется после проверки identity. Внешне разрешены только ListAccounts и ListOperations. Свой userId допускается; иной или отсутствующий userId требует серверной проверки SYSTEM_ADMIN. Затем context.actor заменяется субъектом токена. GetAccount, CreateOperation, CreateHold и остальные методы не становятся публичными из-за наличия protobuf.
Внутренний транспорт
Финансовые команды остаются в доверенном Kafka-контуре; внешний bearer не защищает его автоматически. Старые REST-пути и мост авторизации не восстанавливаются как обход. Источник: apps/services/ledger/src/domains/ledger/presentation/ledger-access.interceptor.ts. API и ошибки.