Мне нужно реализовать RBAC в проекте, над которым я работаю, и я довольно новичок в этой концепции. Я пытаюсь понять, как лучше всего ее реализовать.
Наиболее распространенным подходом кажется создание ролей и разрешений и связывание их вместе через код, я изучил несколько библиотек для этого, таких как CASL и accesscontrol. Но мне кажется, что им не хватает возможности быстро добавлять и удалять разрешения и роли.
Второй подход заключается в добавлении таблиц в базу данных и проверке при каждом запросе разрешений, которыми обладает данный пользователь, перед авторизацией. Это кажется расточительством, поскольку при каждом запросе происходит дополнительное обращение к базе данных. Или я мог бы хранить разрешения в заголовках, но при таком подходе разрешения будут открыты для клиента.
Какой подход является наиболее подходящим?
Нужно ли вам, чтобы набор ролей и сопоставлений контролировался пользователем, или это то, что можно исправить во время компиляции? Если они должны быть настраиваемыми, то вам нужно хранить их в каком-то постоянном хранилище данных, например в базе данных.
Если они настраиваются и хранятся в базе данных, то какой уровень неизменности допустим? Если не допускается никакого застоя, то да, вам придется запрашивать сопоставления ролей и разрешений при каждом запросе. Если допустима некоторая застойность, то кэширование может помочь вам снизить затраты на производительность. Существует несколько различных способов реализации кэширования:
В прошлом я использовал большинство из этих подходов в различных проектах. Выбор подходящего для вашего проекта - это вопрос баланса между сложностью реализации и требованиями безопасности, которые вы предъявляете к использованию системы.