不确定您是否已经阅读过它,但金字塔确实带有一个非常好的权限系统。使用 ACL 进行授权。
如何处理它,它真的只取决于你......你可以有一个 ACL 表
(object_id,允许/拒绝,谁?(组,用户 ID),权限,顺序)
- object_id 是数据库中记录的唯一 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
当您访问page1时,如果找不到它,它将检查acl ,如果父级有acl,它将检查父级,它将检查它的权限,如果没有,它将检查其父级,直到您到达根。如果它找不到权限,我不太确定会发生什么。我猜它会给你一个禁止错误或谓词错误。它找不到合适的视图。
也就是说,为了完成这项工作,您必须制作知道其父母的位置感知对象。
但是你为什么要这么做呢?
您可以为任何对象设置 acl,并且可以非常精细地控制谁可以查看或不查看数据库中的每个对象。您也可以将 acl 直接放在您的类对象中,无需数据库。
只要你的acl在属性acl金字塔里就可以用它做点什么。你如何得到它并不重要。
看一下这个
http://pyramid.readthedocs.org/en/1.3-branch/tutorials/wiki/authorization.html