5

我目前正在使用 Pyramid 开发一个小的 Python 网站。
但我不知道如何设计权限系统。
系统应该非常灵活:我必须在许多不同的表之间建立连接。
我没有为每个变体编写一个权限表,而是只创建一个表 - 我称之为 PermissionCollection:

权限集合:

  • permissionCollectionId - PrimaryKey
  • onType = ENUM("USER","TEACHER","GROUP","COURSE"...)
  • onId = 整数

和权限表:

  • permissionId - PrimaryKey
  • 钥匙
  • 价值
  • permissionCollectionId - ForeignKey

我将为源中硬编码的每个可能的关系定义标准 PermissionCollection,如果用户、课程、教师...具有特殊权限,我将创建一个新的 PermissionCollection 并向其添加权限。

我对网络编程很陌生,不知道这种方法是否有用。或者,如果这样的事情甚至存在。我认为 Pyramid ACL 不是此任务的正确工具,是吗?

4

1 回答 1

4

不确定您是否已经阅读过它,但金字塔确实带有一个非常好的权限系统。使用 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

于 2012-04-20T01:49:07.160 回答