RBAC - использование базы данных против жесткого кода

RBAC - использование базы данных против жесткого кода
RBAC - использование базы данных против жесткого кода - aweilguny @ Unsplash

Мне нужно реализовать RBAC в проекте, над которым я работаю, и я довольно новичок в этой концепции. Я пытаюсь понять, как лучше всего ее реализовать.

Наиболее распространенным подходом кажется создание ролей и разрешений и связывание их вместе через код, я изучил несколько библиотек для этого, таких как CASL и accesscontrol. Но мне кажется, что им не хватает возможности быстро добавлять и удалять разрешения и роли.

Второй подход заключается в добавлении таблиц в базу данных и проверке при каждом запросе разрешений, которыми обладает данный пользователь, перед авторизацией. Это кажется расточительством, поскольку при каждом запросе происходит дополнительное обращение к базе данных. Или я мог бы хранить разрешения в заголовках, но при таком подходе разрешения будут открыты для клиента.

Какой подход является наиболее подходящим?

Нужно ли вам, чтобы набор ролей и сопоставлений контролировался пользователем, или это то, что можно исправить во время компиляции? Если они должны быть настраиваемыми, то вам нужно хранить их в каком-то постоянном хранилище данных, например в базе данных.

Если они настраиваются и хранятся в базе данных, то какой уровень неизменности допустим? Если не допускается никакого застоя, то да, вам придется запрашивать сопоставления ролей и разрешений при каждом запросе. Если допустима некоторая застойность, то кэширование может помочь вам снизить затраты на производительность. Существует несколько различных способов реализации кэширования:

  • Сопоставления ролей и разрешений связываются для конкретного пользователя во время входа в систему и кэшируются на время сессии. Этот подход в основном имеет смысл для приложений, где сопоставления ролей и разрешений меняются нечасто, а пользователь обычно проводит короткие сессии.
  • Сопоставления ролей и полномочий могут кэшироваться на определенное время (например, на пять минут), а затем запрашиваться из базы данных по истечении срока действия кэшированных значений. Такой подход имеет смысл в случаях, когда сопоставления ролей и разрешений часто меняются или пользователи имеют большую продолжительность сеанса.
  • Если у вас есть инфраструктура событий, которая поддерживает это, вы можете аннулировать/перезаполнить сопоставления разрешений в кэше каждый раз, когда администратор изменяет разрешения через пользовательский интерфейс.

В прошлом я использовал большинство из этих подходов в различных проектах. Выбор подходящего для вашего проекта - это вопрос баланса между сложностью реализации и требованиями безопасности, которые вы предъявляете к использованию системы.


LetsCodeIt, 18 декабря 2022 г., 17:47