Python 存储项目的金字塔授权

Python 存储项目的金字塔授权,python,authorization,pyramid,Python,Authorization,Pyramid,我正在尝试创建一个考虑“项目”所有权的授权策略。例如,某些用户X“拥有”项目A、B、C。这些项目通过URL访问,如/item/{item}/some_options 如何将有关{item}的信息获取到授权策略对象(permissions()调用)?将附加信息放入上下文是一个好主意(我只做基于路由的路由)。我该怎么做呢?您可以使用ACLAuthorizationPolicy结合URL分派,使用为此目的而设计的自定义资源树来完成此操作 例如,您拥有Foo对象的权限,以及Bar对象的权限。通过使用UR

我正在尝试创建一个考虑“项目”所有权的授权策略。例如,某些用户X“拥有”项目A、B、C。这些项目通过URL访问,如
/item/{item}/some_options


如何将有关
{item}
的信息获取到授权策略对象(permissions()调用)?将附加信息放入上下文是一个好主意(我只做基于路由的路由)。我该怎么做呢?

您可以使用
ACLAuthorizationPolicy
结合URL分派,使用为此目的而设计的自定义资源树来完成此操作

例如,您拥有
Foo
对象的权限,以及
Bar
对象的权限。通过使用URL遍历资源树,可以找到这些ACL:

/foos/{obj}
/bars/{obj}
然后,您的资源树成为一个权限层次结构,您可以在树中的任何位置将
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

root                       (Root)
|- foos                    (FooContainer)
|  `- {obj}                (Foo)
`- bars                    (BarContainer)
   `- {obj}                (Bar)
您可以在资源树中表示此层次结构:

类根目录(dict): #这是根工厂,您可以在这里为所有资源设置一个_acl __acl_uuu=[ (允许“管理”所有权限), ] 定义初始化(自我,请求): self.request=请求 self['foos']=FooContainer(self,'foos') self['bar']=BarContainer(self,'bar') 类FooContainer(对象): #在此处为Foo类型的*all*对象设置ACL __acl_uuu=[ ] 定义初始化(自身、父项、名称): self.\uuuu parent\uuuu=父 self.\uuuuu name\uuuuu=name def _u获取项目(自身,密钥): #获取数据库连接 s=DBSession() obj=s.query(Foo).filter_by(id=key).scalar() 如果obj为无: 上升键错误 obj.\uuuuu父对象\uuuuuu=自身 对象名称=键 返回obj 类Foo(对象): #此acl是基于特定对象动态计算的 @财产 定义acl(自身): ACL=[(允许在self.owners中为o使用'u:%d'%o.id',view')] 返回ACL 所有者=关系('FooOwner') 类栏(对象): #允许任何经过身份验证的用户查看条形图对象 __acl_uuu=[ (允许,已验证,“查看”) ]
通过这样的设置,您可以将路由模式映射到资源树:

config=Configurator()
config.add_route('item_options','/item/{item}/some_options',
#告诉金字塔在资源树中该url的位置
遍历='/foos/{item}')
您还需要将路线映射到特定视图:

config.add_视图(route_name='item_options',view='.views.options_view',
权限class='view',呈现器class='item\u options.mako')
很好,现在我们可以定义视图并使用加载的上下文对象,知道如果执行视图,用户就有相应的权限

def选项\u视图(请求):
foo=request.context
返回{
"福":福,,
}
使用此设置,您将使用默认的
ACLAuthorizationPolicy
,并通过URL分派为对象提供行级权限。另外请注意,由于对象在子对象上设置了
\uuuuu parent\uuuu
属性,因此该策略将冒泡沿袭,从父对象继承权限。只需在ACL中添加一个
DENY_ALL
ACE,或者编写一个不使用上下文沿袭的自定义策略,就可以避免这种情况

*更新* 我已经把这篇文章变成了Github上的一个实际演示。希望它能帮助别人。

*更新*
我在这里写了一篇关于pyramid的身份验证和授权系统的完整教程:

建议您将非常有用的教程做得更详细:最好在这里讨论您对容器的使用,因为我不确定在使用数据库连接时如何构造资源树。我在看了教程后找到了这个答案,它帮了我很大的忙。