Чтобы решить эту проблему, нам нужна динамическая реализация, в которой доступ к API ограничен активно используемыми функциями.
Вопрос-1: Мы нашли подход, упомянутый ниже, но он громоздкий, подвержен ошибкам и требует много времени, поэтому нам нужно знать, есть ли какая-либо альтернатива этому подходу.
Существующий подход:
У нас есть таблица функций, в которой мы храним угловые URL-адреса, связанные с этой функцией, в столбце URLS и API контроллера в столбце APIS, как указано ниже:
Настройка базы данных:
- Таблица сопоставления функций и API:
Код: Выделить всё
FeatureID | FeatureName | Code | URLS | APIS
----------|------------------|-------|----------------------------|------------------------------
1 | UserManagement | UM | /user/create,/user/update | /api/user/create,/api/user/update
2 | ProductCatalog | PC | /product/view,/product/edit| /api/product/view,/api/product/edit
Кэшированная структура:
- Кеш хранит сопоставление как:
Код: Выделить всё
{
"Admin": [
{
"code": "UM",
"urls": ["/user/create", "/user/update"],
"apis": ["/api/user/create", "/api/user/update"]
},
{
"code": "PC",
"urls": ["/product/view", "/product/edit"],
"apis": ["/api/product/view", "/api/product/edit"]
}
],
"User": [
{
"code": "PC",
"urls": ["/product/view"],
"apis": ["/api/product/view"]
}
]
}
- Внешний интерфейс:
- Журналы пользователей в зависимости от их роли (например, «Администратор») система выбирает соответствующие функции и их URL-адреса для динамической защиты маршрутов.
- Бэкенд:
- Когда делается запрос к /api/user/create с /user/create в заголовке:
Бэкэнд извлекает роль из сеанса (например, «Администратор»). - Он извлекает список FeatureApisUrlsDto для «Администратора» из кеша.
- Он перебирает список, соответствующий URL-адресу () с функцией и проверяет, доступен ли API (
Код: Выделить всё
/user/create
) разрешено.Код: Выделить всё
/api/user/create
Постановка проблемы:- Опрос к базе данных для каждого запроса API требует больших затрат, поэтому мы кэшируем карта API локальна на каждом сервере.
- Мы работаем в распределенной серверной среде без централизованного кэширования, поэтому обновляйте кеш каждые 5 минут.
- Этот подход работает, но имеет ограничения:
При частых обновлениях кеша могут быть пропущены немедленные изменения в разрешениях. . - Проблемы с масштабируемостью из-за большого количества API.
Вопросы: - Когда делается запрос к /api/user/create с /user/create в заголовке:
- Есть ли лучший способ динамического управления API в такой системе с минимальными изменениями в существующей архитектуре?
- Если мы продолжим использовать этот подход:
- Что лучше хранить — конечные точки API в базе данных или файл JSON в системе (вместе с кодами функций)?
- Как мы можем обеспечить синхронизацию между распределенные серверы без реализации централизованного кэша?
- У нас есть значительное количество API и функций.
- Мы хотим свести к минимуму изменения в существующей системе.
На данный момент мы не можем реализовать централизованное кэширование.< /li>
Подробнее здесь: https://stackoverflow.com/questions/793 ... d-distribu