设计权限系统的最佳实践

Fel*_*ost 5 python sql permissions sqlalchemy pyramid

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

PermissionCollection中:

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

和权限表:

  • permissionId - PrimaryKey
  • permissionCollectionId - ForeignKey

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

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

Loï*_*oix 4

不确定你是否已经读过它,但金字塔确实配备了一个非常好的许可系统。通过ACL进行授权。

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

(object_id、允许/拒绝、谁?(组、用户 ID)、权限、顺序)

  • object_id 是数据库中记录的唯一 ID
  • 允许/拒绝是该 ACE 应该执行的操作...允许或拒绝访问
  • WHO?可以是组、用户名或任何你想要的东西,例如系统。每个人都是每个人
  • Permission是view_config中的权限参数
  • 顺序是一件重要的事情 顺序确实很重要

例如

__acl__ = [
(Deny, Everyone, 'view'),
(Allow, 'group:admin', 'view')
]
Run Code Online (Sandbox Code Playgroud)

即使对于管理员来说,该示例也将始终拒绝查看...一旦金字塔找到告诉您是否可以看到或看不到记录的内容,它就会自动停止搜索

__acl__ = [
(Allow, 'group:admin', 'view'),
(Deny, Everyone, 'view')
]
Run Code Online (Sandbox Code Playgroud)

这将允许每个管理员查看,但不允许其他任何人查看。这就是为什么您必须记住 ACE 的顺序。

有趣的部分实际上就在这里。这一切都很好。您已将 acl 映射到数据中的记录。例如,当您加载页面时...您将必须加载 acl 并将它们设置在您的对象中。

myobject.__acl__ = load_acls(myobject) 
Run Code Online (Sandbox Code Playgroud)

如果你有一个数据树。你甚至可以不设置 acls。

例如,您有一个看起来像这样的网站

root
  \--pages with acl
      +---- page1  without acl
      \---- page2  with acl
Run Code Online (Sandbox Code Playgroud)

当您访问 page1 时,如果找不到,它将检查 acl,如果级有 acl,它将检查级,如果没有,它将检查其父,直到您访问到达根。如果它找不到权限,我不太确定会发生什么..我想它会给你一个禁止错误或谓词错误。它找不到正确的视图。

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

但你为什么要做这一切呢?

您可以对任何对象拥有 ACL,并且可以对谁可以监视数据库中的每个对象进行真正细粒度的控制。您还可以将 acl 直接放在类对象中,而不需要数据库。

只要你的acl在属性acl中金字塔中就可以用它做一些事情。你如何得到它并不重要。

看一下这个

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