Python 存储项目的金字塔授权
我正在尝试创建一个考虑“项目”所有权的授权策略。例如,某些用户X“拥有”项目A、B、C。这些项目通过URL访问,如Python 存储项目的金字塔授权,python,authorization,pyramid,Python,Authorization,Pyramid,我正在尝试创建一个考虑“项目”所有权的授权策略。例如,某些用户X“拥有”项目A、B、C。这些项目通过URL访问,如/item/{item}/some_options 如何将有关{item}的信息获取到授权策略对象(permissions()调用)?将附加信息放入上下文是一个好主意(我只做基于路由的路由)。我该怎么做呢?您可以使用ACLAuthorizationPolicy结合URL分派,使用为此目的而设计的自定义资源树来完成此操作 例如,您拥有Foo对象的权限,以及Bar对象的权限。通过使用UR
/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的身份验证和授权系统的完整教程:建议您将非常有用的教程做得更详细:最好在这里讨论您对容器的使用,因为我不确定在使用数据库连接时如何构造资源树。我在看了教程后找到了这个答案,它帮了我很大的忙。