Дано: пользователи, группы пользователей, права доступа, роли пользователей.
Группы могут включать пользователей и другие группы. Группа может быть включена в несколько групп, лишь бы не было циклов.
Права доступа объединяются в роли.
Группам, но не пользователям, назначаются роли.
Проверка наличия права доступа у пользователя выглядит как:
Есть ли среди всех групп пользователей, в которые входит данный пользователь прямо или косвенно те, которым назначена роль разрешающая право доступа одновременно с отсутствием групп пользователей, в которые входит данный пользователь прямо или косвенно, у которых назначена роль запрещающая право доступа?
Проблема в том, что группы и пользователи могут быть по отношению к системе внешние (например, из Active Directory или любого другого LDAP-каталога), а права доступа и роли пользователей тоже необходимо иметь возможность хранить по-разному (например, в базных БД).
Это всё на фоне очень жёстких требований по производительности операции проверки наличия права доступа у пользователя.