- Создал(а) Неизвестный пользователь (pavel.shevchenko), редактировал(а) Неизвестный пользователь (a.s.voronin@rt-sk.ru) янв 07, 2025

## GIT

https://git.gosuslugi.local/pgs2-rtlabs/source/endpoints-access-info/-/tree/master/

## Назначение

Сервис для хранения таблицы маршрутизации запросов и прав доступов к эндпоинтам сервисов.
Принимает из сообщений кафки информацию об эндпоинтах сервиса и прав доступа к ним. Сохраняет эту информацию в postgres. Эта информация в дальнейшем используется сервисом proxy-gateway.

У сервиса нет собственных REST API контроллеров (rest api методов) - всё взаимодействие производится через KAFKA

## БД

Сервис имеет собственную БД endpoints-access-info в Postgres с 1 таблицей access_info

### Структура таблицы access_info:

Имя поля | Формат | Описание | Пример
--- | --- | --- | ---
id | bigint | primary key |
app_name | varchar(255) | Имя приложения, должно быть равно имени его Service кубера | nsi-registry
pkg | varchar(500) | Абсолютный путь к java классу с контроллером, поле для информации, не участвует в логике. | sx.microservices.nsiregistry.controller.registry.RegistryController
method | varchar(255) | метод запроса - GET, POST и т.п. | Get
ingress_path | varchar(500) | Базовый путь к приложению, то же самое что и сейчас у него в пути ingress. | /service/nsi-registry
path | varchar(500) | Путь к эндпоинту внутри приложения, например "/requests/example". Поддерживается wildcard, пример - "/request/*" - будет принимать любое значение на месте * Еще пример "/request/*/*" | /registry/*/records
rules | jsonb | Json с полями perms и roles, где perms - массив permissions, roles - массив ролей. Можно указать либо что-то одно либо ничего вообще. | {"perms": null, "roles": null} - означает что для доступа достаточно лишь валидного токена, без разницы какие у него роли.
manual | boolean | Поле для определения в ручную заполнен этот маршрут запросом в базу или автоматически сервисом enpoints-access-info-service | false
modified | timestamp | Дата редактирования | 2023-03-21 10:10:10.287561
modified_by | varchar(255) | Источник редактирования | Manual или AccessInfoService

## Примеры скриптов для таблицы access-info

Примеры указаны без учёта требования отдела DBA по оформлению скриптов для релиза.

Полностью одинаковых (дублей) записей в таблице access_info делать не нужно.

### Добавление новой записи:

В первую очередь рекомендуется проверить есть ли уже такая запись, чтобы не плодить дубли. Если такая запись уже есть - проверить актуальные ли права доступа в ней.
Скрипт добавления записи

`INSERT INTO access_info(id``,``app_name``,``pkg``,``method``,``ingress_path``,``path``,``rules``,``manual) VALUES` `(nextval(``'access_info_seq'``)``,``'ervu-application-gateway'``,``'Manual'``,``'Get'``,``'/service/ervu-application-gateway'``,``'/applicationInfo/getWithActive/*'``,``'{"perms": [], "roles": []}'``,``'true'``)`

### Обновление записи в таблице:

Обновление по id, задание прав доступа:
Скрипт обновления записи

`UPDATE access_info` `SET rules =` `'{"roles": ["Администратор облака"], "perms": "read_user"}'` `WHERE id =` `2000000000001`

Удаление записи в таблице:

Для удаления лучше всего использовать id чтобы не удалить лишнего

### Скрипт удаления записи

`DELETE` `FROM access_info` `WHERE id = <ID>`

## KAFKA

Взаимодействует только с топиком pgs.proxy.endpoints.access.inf o как consumer и producer

Пример сообщения

[
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.registry.RegistryController",
"method": "Get",
"ingressPath": "/service/nsi-registry",
"path": "/registry/*/records",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.SocialOrganizationsINNController",
"method": "Put",
"ingressPath": "/service/nsi-registry",
"path": "/socialorganizationsinn",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.SocialOrganizationsINNController",
"method": "Get",
"ingressPath": "/service/nsi-registry",
"path": "/socialorganizationsinn",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.registry.RegistryController",
"method": "Get",
"ingressPath": "/service/nsi-registry",
"path": "/registry/*/*",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.SocialOrganizationsINNController",
"method": "Delete",
"ingressPath": "/service/nsi-registry",
"path": "/socialorganizationsinn",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.MCHSController",
"method": "Post",
"ingressPath": "/service/nsi-registry",
"path": "/mchs",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.registry.RegistryController",
"method": "Post",
"ingressPath": "/service/nsi-registry",
"path": "/registry/*",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.registry.RegistryController",
"method": "Delete",
"ingressPath": "/service/nsi-registry",
"path": "/registry/*/*",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.AverageSalariesController",
"method": "Post",
"ingressPath": "/service/nsi-registry",
"path": "/averagesalaries",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.ClassifierController",
"method": "Get",
"ingressPath": "/service/nsi-registry",
"path": "/classifier",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.SocialOrganizationsINNController",
"method": "Post",
"ingressPath": "/service/nsi-registry",
"path": "/socialorganizationsinn",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.MCHSController",
"method": "Delete",
"ingressPath": "/service/nsi-registry",
"path": "/mchs",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.MCHSController",
"method": "Get",
"ingressPath": "/service/nsi-registry",
"path": "/mchs",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.MCHSController",
"method": "Put",
"ingressPath": "/service/nsi-registry",
"path": "/mchs",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.AverageSalariesController",
"method": "Delete",
"ingressPath": "/service/nsi-registry",
"path": "/averagesalaries",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.registry.RegistryController",
"method": "Get",
"ingressPath": "/service/nsi-registry",
"path": "/registry/*",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.registry.RegistryController",
"method": "Put",
"ingressPath": "/service/nsi-registry",
"path": "/registry/*",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.AverageSalariesController",
"method": "Put",
"ingressPath": "/service/nsi-registry",
"path": "/averagesalaries",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.registry.RegistryController",
"method": "Delete",
"ingressPath": "/service/nsi-registry",
"path": "/registry/*",
"rules": {}
},
{
"appName": "nsi-registry",
"pkg": "sx.microservices.nsiregistry.controller.AverageSalariesController",
"method": "Get",
"ingressPath": "/service/nsi-registry",
"path": "/averagesalaries",
"rules": {}
}
]

## Взаимодействие с proxy-gateway

Библиотека pgs-proxy-library на старте приложения находит все контроллеры с аннотацией PgsAccessRules, принимает из нее роли и permissions, формирует запись вида Method, Path, rules и отправляет через кафку в сервис endpoints-access-info, который сохраняет полную информацию о маршрутах в базу postgres актуализируя записи (если для этого сервиса записи уже есть - он их пересоздаст, таким образом поддерживается удаление и обновление ендпоинтов в таблице маршрутизации), при этом если у существующей записи стоит признак manual = true - то запись не будет обновлена либо удалена, это сделано для того, чтобы иметь возможность в ручную изменять записи и чтобы они после этого не перезаписывались автоматически.

### Схема взаимодействия

Нравится Станьте первыми кому понравится это

- Нет меток
- Редактировать метки

Написать комментарий...

Добавить комментарий

Обзор
Инструменты контента
{"serverDuration": 112, "requestCorrelationId": "8829484496687aba"}