Масштабируемая аутентификация на основе ролей - PullRequest
0 голосов
/ 26 мая 2009

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

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

The other image here

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

Image goes here

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

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


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

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

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

Ответы [ 3 ]

2 голосов
/ 26 мая 2009

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

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

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

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

0 голосов
/ 26 мая 2009

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

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

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

0 голосов
/ 26 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...