Иерархическая групповая теория разрешений/ресурсы?

StackOverflow https://stackoverflow.com/questions/75463

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Немного предыстории:Я создаю систему учетных записей пользователей для веб-CMS, которая допускает иерархию вложенных групп.Каждой группе можно разрешить/запретить доступ на чтение, запись, добавление и удаление (явно для этой группы или неявно одним из ее родителей).Как будто это было недостаточно сложно, система также позволяет пользователям быть членами нескольких групп.-- Вот здесь я и застрял.У меня все настроено, но я борюсь с реальной логикой определения разрешений для данного пользователя.

Это было полезно?

Решение

В руководстве CakePHP есть отличное описание того, как работают списки контроля доступа.

http://book.cakephp.org/2.0/en/core-libraries/comComponents/access-control-lists.html

Другие советы

Представляйте разрешения, установленные для данной группы, в виде битовой маски.Объединение битовых масок ИЛИ даст вам результирующий набор разрешений.

Обновление для @Alex:

Я написал этот ответ 3 года назад, но думаю, что имел в виду следующее...

Из вопроса

иерархия вложенных групп.Каждая группа может быть разрешена/запрещена доступом к чтению, записи, добавлению и удалению (либо явно для этой группы, либо неявно одним из ее родителей).Как будто это не было достаточно сложным, система также позволяет пользователям быть членами нескольких групп.-- Вот здесь я и застрял.У меня все настроено, но я борюсь с реальной логикой для определения Pemissions для данного пользователя.

Назначьте битовую маску, соответствующую общему набору разрешений группы (или роли) в системе:

например 00 (использование двух битов упрощает задачу!)

Первый бит дает Permission A и второй Permission B.

Теперь предположим, что группа A предоставляет следующий набор разрешений: 01.

...и предположим, что группа B предоставляет следующий набор разрешений: 10.

Чтобы получить результирующий набор разрешений для пользователя в произвольном наборе групп, вы можете выполнить логическое OR в битовых масках набора разрешений:

Permission set for Group A   01
Permission set for Group B   10 OR 
                             ----
Resultant permission set     11 (i.e. both permission A and B are conferred)

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

Посмотрите разрешения в Эндрю Файловая система.Он позволяет пользователям создавать и администрировать собственные группы, выборочно назначая права администратора и списки ACL.Вы можете обнаружить, что многие неприятные детали уже проработаны за вас в их модели.

Редактировать: вот лучшая ссылка на документацию AFS:

http://www.cs.cmu.edu/~help/afs/index.html

Вот раздел о группах:

http://www.cs.cmu.edu/~help/afs/afs_groups.html

Я делал именно это раньше, и это нетривиальная реализация.Вам захочется взглянуть на класс SecurityPermission.

[http://msdn.microsoft.com/en-us/library/system.security.permissions.securitypermission.aspx][1]

Я делал это раньше, используя XML (что я не уверен, что буду делать снова) и сохраняя этот XML как список разрешений внутри SQL-сервера в столбце XML через хранимую процедуру CLR.В XML будет элемент, называемый «разрешение», и тогда разрешение фактически будет ENUM внутри кода.Каждое разрешение представляло собой новую реализацию класса SecurityPermission (ссылка выше). Пользователи были привязаны к группам, которые были определены на SQL-сервере, а затем, когда пользователь добавлялся или удалялся из групп, XML-документ обновлялся, чтобы отражать, в каких группах они находились отдельно. из.

Как только пользователь войдет в систему, его учетные данные будут загружены в хранилище приложений (сеанс), а затем будут доступны соответствующим образом.При необходимости авторизации XML в хранилище приложений будет загружен в SecurityPermission с помощью метода FromXML.На этом этапе я бы использовал следующие методы, чтобы определить, есть ли у пользователя разрешение:

  • Требовать
  • Пересекаться
  • Союз
  • Неограниченный
  • Иссубсетоф

и т. д., и т. д., и т. д.

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

Опять же, здесь упущено МНОГО деталей, но это должно помочь вам идти по правильному пути.

Взгляните также на это пространство имен:[2]: http://msdn.microsoft.com/en-us/library/system.security.permissions.aspx «Система.Безопасность.Разрешения»

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top