【问题标题】:Best practice designing a permission system设计权限系统的最佳实践
【发布时间】:2012-04-28 22:27:49
【问题描述】:

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

权限集合:

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

和权限表:

  • permissionId - PrimaryKey
  • 价值
  • permissionCollectionId - ForeignKey

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

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

【问题讨论】:

  • 大多数 RDBMS 都有一个GRANT/REVOKE 命令,用于允许(在各个级别)访问数据库中的表/模式。其中一些甚至还有用户组的概念,这意味着您可以为整个组执行命令。因此,您可能会尝试在应用程序级别做一些事情,这已经存在于数据库级别(这将更加安全)。
  • 但是我的数据库用户不是 GRANT 吗?我的应用程序的用户并不意味着数据库用户
  • GRANT is 适用于数据库用户,是的。但是,如果您编写应用程序来检查权限(基于登录应用程序的人员/内容),您也可以将它们作为特定的数据库用户登录(通常可以在连接字符串中提供这些)。这将有助于审计以及控制访问。
  • 谢谢。我误解了这一点。

标签: python sql permissions sqlalchemy pyramid


【解决方案1】:

不确定您是否已经阅读过它,但金字塔确实带有一个非常好的权限系统。使用 ACL 进行授权。

如何处理,这真的只取决于你...... 你可以有一个 ACL 表

(object_id, allow/deny, who?(group, userid), permission, order)

  • object_id 是数据库中记录的唯一 ID
  • 允许/拒绝是这个 ACE 应该做的事情...允许或拒绝访问
  • 谁?可以是组、用户名或您想要的任何内容,例如 system.everyone 是每个人
  • permission是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,如果parent会检查parent有一个acl,它会检查它的权限,如果没有,它会检查它的parent,直到你到达root。如果它找不到权限,我不太确定会发生什么。我想它会给你一个禁止的错误或谓词错误。它找不到合适的视图。

也就是说,为了完成这项工作,您必须制作知道其父母的位置感知对象。

但是你为什么要这么做呢?

您可以为任何对象设置 acl,并且可以非常精细地控制谁可以查看或不查看数据库中的每个对象。你也可以直接把acl放在你的类对象中,不用数据库。

只要你的acl在属性acl中,金字塔就能用它做点什么。你如何得到它并不重要。

看看这个

http://pyramid.readthedocs.org/en/1.3-branch/tutorials/wiki/authorization.html

【讨论】:

  • 不错。谢谢。我也可以使用我的桌子吗?在您的方法中:应用程序如何确定 who:1 是否代表 id 为 1 的用户 id 为 1 的组?所以,我只写了一个函数,为遍历树中的每个元素生成这个 acl 元组。我可以在构造函数中加载 acl 吗?
  • 是的,只要您的实例 acl 设置为元组列表 (ACE),您就可以在任何地方加载 acl。
  • 顺序真的很重要。金字塔一旦确定它是否可以允许或拒绝对元素的访问。它会回来的。在某些情况下,如果您拥有简单的权限,顺序并不重要。但是我上面的例子......如果你首先拒绝所有人,然后只允许管理员在第二次......它将拒绝所有人然后返回。它甚至不会检查允许管理员。因此,如果您想控制 ACL 中哪个 ACE 首先出现,那么设置顺序非常重要。另外,如果您进入 development.ini 文件。您可以启用身份验证调试
猜你喜欢
  • 2012-06-09
  • 2011-04-23
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 2010-09-21
  • 2011-04-25
  • 2021-09-20
  • 1970-01-01
相关资源
最近更新 更多