В настоящее время я разрабатываю систему аутентификации на основе ролей для ресурсов, к которым многие пользователи имеют разные права доступа.
Роль может быть отдельным пользователем или группой ролей (таким образом, роль — это дерево ролей). (см. рисунок ниже)
Ресурс может иметь несколько свойств проверки подлинности (например, чтение, запись, удаление), где каждое из них представляет собой список ролей, которым разрешен доступ к операции. (см. рисунок ниже)
Проблема в том, что если я хочу проверить, имеет ли пользователь право доступа к свойству, в худшем случае мне нужно пройти n деревьев (где n — количество ролей, назначенных свойству).
Так, например, чтобы проверить, может ли «Макс» прочитать свойство, мне, возможно, придется проверить деревья «Маркетинг», «Управление» и «Администрирование», если они содержат «Макс».
Знаете ли вы какой-либо алгоритм или альтернативный подход, который удаляет довольно дорогостоящие поиски по дереву, сохраняя при этом ролевую систему или что-то столь же мощное.
Идеальным случаем будет поиск типа O(log(n)) для n ролей.
Спасибо, Фионн