Я хочу создать схему для ACL; однако я разрывается между несколькими способами его реализации.
Я уверен, что я не хочу иметь дело с каскадными разрешениями, поскольку это приводит к большой путанице в бэкэнд и для администраторов сайтов.
Я думаю, что я также могу жить с пользователями, которые будут играть только одну роль за раз. Подобная настройка позволит добавлять роли и разрешения по мере необходимости, поскольку сайт растет, не затрагивая существующие роли/правила.
Сначала я собирался нормализовать данные и иметь три таблицы для представления отношений.
ROLES { id, name }
RESOURCES { id, name }
PERMISSIONS { id, role_id, resource_id }
Запрос, чтобы выяснить, разрешен ли пользователь где-нибудь, будет выглядеть так:
SELECT id FROM resources WHERE name = ?
SELECT * FROM permissions WHERE role_id = ? AND resource_id = ? ($user_role_id, $resource->id)
Тогда я понял, что у меня будет только около 20 ресурсов, каждая из которых имеет до 5 действий (создание, обновление, просмотр и т.д.) и, возможно, еще 8 ролей. Это означает, что я могу проявлять явное пренебрежение нормализацией данных, поскольку у меня никогда не будет более нескольких сотен возможных записей.
Так что, возможно, такая схема имела бы смысл.
ROLES { id, name }
PERMISSIONS { id, role_id, resource_name }
который позволит мне искать записи в одном запросе
SELECT * FROM permissions WHERE role_id = ? AND permission = ? ($user_role_id, 'post.update')
Итак, какая из них правильнее? Существуют ли другие схемы компоновки для ACL?