В настоящее время я разрабатываю небольшой веб-сайт на Python с использованием Pyramid.
Но я не знаю, как спроектировать систему разрешений.
Система должна быть очень гибкой: мне нужно установить соединения между множеством разных таблиц.
Вместо того, чтобы писать одну таблицу разрешений для каждого варианта, я решил просто создать одну таблицу - я назвал ее PermissionCollection:
Коллекция разрешений:
- разрешениеCollectionId - первичный ключ
- onType = ENUM("ПОЛЬЗОВАТЕЛЬ","УЧИТЕЛЬ","ГРУППА","КУРС"...)
- onId = целое число
и таблица разрешений:
- идентификатор разрешения - первичный ключ
- ключ
- ценность
- разрешениеCollectionId - иностранный ключ
Я определю стандартные коллекции PermissionCollection для всех возможных отношений, жестко запрограммированных в источниках, и если у пользователя, курса, учителя... есть особые права, я создам новую коллекцию PermissionCollection и добавлю к ней разрешение.
Я очень новичок в веб-программировании и не знаю, полезен ли этот подход. Или если что-то подобное вообще существует. Я думаю, что Pyramid ACL не подходит для этой задачи, не так ли?
Ответ 1 · рейтинг 4 · Loïc Faure-Lacroix
Не уверен, что вы уже читали об этом, но у пирамиды действительно хорошая система разрешений. Авторизация через ACL.
Как с этим справиться, это действительно зависит только от вас... У вас может быть таблица ACL
(object_id, разрешить/запретить, кто? (группа, идентификатор пользователя), разрешение, порядок)
- object_id - это уникальный идентификатор записи в вашей базе данных.
- разрешить/запретить - это то, что должен делать этот ACE... разрешить или запретить доступ
- кто? это либо группа, либо имя пользователя, либо что угодно, например, system.everyone - это все
- разрешение - это параметр разрешения в view_config.
- порядок - это одна важная вещь порядок имеет значение
Например
__acl__ = [
(Deny, Everyone, 'view'),
(Allow, 'group:admin', 'view')
]
Этот образец всегда будет запрещать просмотр даже для администратора... Как только пирамида найдет что-то, что говорит вам, можете ли вы видеть или не видеть запись, она автоматически прекращает поиск.
__acl__ = [
(Allow, 'group:admin', 'view'),
(Deny, Everyone, 'view')
]
Это позволит просматривать для каждого администратора, но не для всех остальных. Вот почему вы должны помнить порядок своих ACE.
На самом деле самое интересное здесь. Это все хорошо. У вас есть acl, сопоставленный с записью в ваших данных. Когда вы загружаете, например, страницу... Вам нужно будет загрузить acl и установить их в свой объект.
myobject.__acl__ = load_acls(myobject)
Если у вас есть дерево данных. Можно даже не ставить acls.
Например, у вас есть сайт, который выглядит так
root
\--pages with acl
+---- page1 without acl
\---- page2 with acl
Когда вы получите доступ к странице 1, он проверит acl, если не сможет его найти, он проверит parent, если parent имеет acl , он будет проверять разрешение для него, если нет, он будет проверять его родителя, пока вы не достигнете root. Если он не может найти разрешение, я не уверен, что произойдет. Я думаю, это либо даст вам запрещенную ошибку, либо предикатную ошибку. Что он не может найти правильный вид.
Тем не менее, для того, чтобы сделать эту работу, вы должны сделать объект осведомленным о местоположении, который знает своих родителей.
Но зачем тебе все это?
Вы можете иметь acl для любого объекта и иметь очень тонкий контроль над тем, кто может просматривать или не просматривать каждый объект в вашей базе данных. Вы также можете поместить acl непосредственно в объект класса без базы данных.
пока ваш acl находится в пирамиде атрибутов acl, вы сможете что-то с ним сделать. Не так важно, как вы это получили.
Проверь это
http://pyramid.readthedocs.org/en/1.3-branch/tutorials/wiki/authorization.html