Масштабируемая аутентификация на основе ролей

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

Роль может быть отдельным пользователем или группой ролей (таким образом, роль — это дерево ролей). (см. рисунок ниже)

Другое изображение здесь

Ресурс может иметь несколько свойств проверки подлинности (например, чтение, запись, удаление), где каждое из них представляет собой список ролей, которым разрешен доступ к операции. (см. рисунок ниже)

Изображение идет  здесь

Проблема в том, что если я хочу проверить, имеет ли пользователь право доступа к свойству, в худшем случае мне нужно пройти n деревьев (где n — количество ролей, назначенных свойству).

Так, например, чтобы проверить, может ли «Макс» прочитать свойство, мне, возможно, придется проверить деревья «Маркетинг», «Управление» и «Администрирование», если они содержат «Макс».


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

Идеальным случаем будет поиск типа O(log(n)) для n ролей.

Спасибо, Фионн


person Fionn    schedule 25.05.2009    source источник
comment
Насколько я вижу, ваше описание функциональных требований/спецификаций включает в себя деревья. Так что либо вам нужно изменить спецификацию, либо найти способ предотвратить довольно затратный поиск по дереву.   -  person ChrisW    schedule 26.05.2009


Ответы (3)


Вы измерили это и определили, что этот обход является узким местом производительности?

Я никогда не видел системы с таким количеством ролей/уровней, что стоимость обхода такой структуры стала бы проблемой. И если дерево действительно такое большое, я бы больше беспокоился о том, что администраторам будет трудно понять, кто что уполномочен делать.

Что касается масштабируемости, я бы обычно использовал кэш ASP.NET для кэширования полного дерева, отображающего ресурсы и роли, с подходящим тайм-аутом кэша. И отдельно кешируйте сопоставление пользователей с ролями (например, в сеансе или с помощью пользовательского ключа в кеше ASP.NET).

Доступ к информации из кеша, как правило, будет невероятно быстрым по сравнению с каждый раз обращением к базе данных.

person Joe    schedule 25.05.2009

Если вы поместите свои роли в базу данных SQL, поиск будет выполняться в основном так, как вы описываете. Я могу помочь вам со структурой базы данных, если вы заинтересованы.

person Robert Harvey    schedule 25.05.2009
comment
База данных SQL на самом деле не устранила бы сложность обхода дерева, напротив, на мой взгляд, деревья в SQL - это довольно больно. Глубина ролей особо не ограничена. - person Fionn; 26.05.2009
comment
Модель «вложенного набора» — это способ очень быстрого выбора поддеревьев в SQL. - person ChrisW; 26.05.2009
comment
Есть хорошее изменение в том, что это будет работать в системе баз данных, такой как Bigtable - нет соединений, только простые таблицы. И даже если вложенный набор работает быстро, я думаю, он не будет так хорошо масштабироваться, поскольку он далек от стандартного поиска в таблице. - person Fionn; 26.05.2009
comment
Нет, метод вложенного множества использует стандартный SQL. Он использует схему, которая замедляет вставки, но очень быстро выбирает: для этого даже не требуется соединение, не говоря уже о рекурсивном соединении. - person ChrisW; 26.05.2009

Вам нужно поменять местами указатели.

«Гарри» является членом «Администраторов Site2», который имеет доступ «Администраторы» к «Site2», поэтому он может «Удалить», «Записать» и «Читать этот контент».

Почему "Администрация" должна быть общей между "Гарри" и "Джо" мне непонятно. Гарри является администратором на одном сайте, но просто пользователем на другом, а Джо наоборот.

person cjs    schedule 25.05.2009
comment
Нет правила, которое говорит, что администратор может делать что угодно, его можно было бы просто назвать ролью SomeUsers, если кто-то может читать, писать или что-то еще, полностью зависит от того, добавлена ​​ли роль, содержащая этого пользователя, к свойству. - person Fionn; 26.05.2009