Иерархическая групповая теория разрешений/ресурсы?
-
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
Вот раздел о группах:
Я делал именно это раньше, и это нетривиальная реализация.Вам захочется взглянуть на класс 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 «Система.Безопасность.Разрешения»