设计权限系统的最佳实践

时间:2012-04-17 14:56:44

标签: python sql permissions sqlalchemy pyramid

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

的PermissionCollection:

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

和权限表:

  • permissionId - PrimaryKey
  • permissionCollectionId - ForeignKey

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

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

1 个答案:

答案 0 :(得分: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

如果您要访问第1页,它会检查 acl ,如果找不到它,它会检查,如果有一个acl,它会检查它的权限,如果没有,它会检查它的,直到你到达root。如果它找不到权限,我不确定会发生什么...我猜它会给你一个禁止的错误或谓词错误。它找不到合适的观点。

那就是说,为了完成这项工作,你必须让位置感知对象知道他们的父母。

但你为什么要这么做呢?

您可以为任何对象获取acl,并且可以对谁可以监视或不监视数据库中的每个对象进行非常精细的控制。您也可以将acl直接放在没有数据库的类对象中。

只要您的acl位于属性 acl 金字塔中,就可以使用它执行某些操作。如何得到它并不重要。

检查出来

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