金字塔授权的存储项目

金字塔授权的存储项目,第1张

金字塔授权的存储项目

您可以使用

ACLAuthorizationPolicy
为此目的而设计的自定义资源树,并结合使用URL调度和URL调度。

例如,您具有

Foo
对象权限
Bar
对象的权限。这些ACL可以通过使用url遍历资源树来找到:

/foos/{obj}/bars/{obj}

然后,您的资源树将成为权限层次结构,您可以在树中的任何时候在

__acl__
资源对象上放置一个:

root (Root)|- foos         (FooContainer)|  `- {obj}     (Foo)`- bars         (BarContainer)   `- {obj}     (Bar)

您可以在资源树中表示此层次结构:

class Root(dict):    # this is the root factory, you can set an __acl__ here for all resources    __acl__ = [        (Allow, 'admin', ALL_PERMISSIONS),    ]    def __init__(self, request):        self.request = request        self['foos'] = FooContainer(self, 'foos')        self['bars'] = BarContainer(self, 'bars')class FooContainer(object):    # set ACL here for *all* objects of type Foo    __acl__ = [    ]    def __init__(self, parent, name):        self.__parent__ = parent        self.__name__ = name    def __getitem__(self, key):        # get a database connection        s = DBSession()        obj = s.query(Foo).filter_by(id=key).scalar()        if obj is None: raise KeyError        obj.__parent__ = self        obj.__name__ = key        return objclass Foo(object):    # this __acl__ is computed dynamically based on the specific object    @property    def __acl__(self):        acls = [(Allow, 'u:%d' % o.id, 'view') for o in self.owners]        return acls    owners = relation('FooOwner')class Bar(object):    # allow any authenticated user to view Bar objects    __acl__ = [        (Allow, Authenticated, 'view')    ]

通过这样的设置,您可以将路由模式映射到资源树:

config = Configurator()config.add_route('item_options', '/item/{item}/some_options',      # tell pyramid where in the resource tree to go for this url      traverse='/foos/{item}')

您还需要将路线映射到特定视图:

config.add_view(route_name='item_options', view='.views.options_view',     permission='view', renderer='item_options.mako')

太好了,现在我们可以定义视图并使用加载的上下文对象,知道如果执行了该视图,则用户具有适当的权限!

def options_view(request):    foo = request.context    return {        'foo': foo,    }

使用此设置,您将使用默认值

ACLAuthorizationPolicy
,并通过URL
Dispatch为对象提供行级权限。另请注意,由于对象
__parent__
在子级上设置了属性,因此该策略将沿袭父辈的权限,使沿袭起泡。只需
DENY_ALL
在ACL中放入ACE,或编写不使用上下文沿袭的自定义策略,就可以避免这种情况。

更新 我已将这篇文章变成Github上的实际演示。希望它可以帮助某人。
https://github.com/mmerickel/pyramid_auth_demo

更新
我已经在此处撰写了有关金字塔认证和授权系统的完整教程:http
:
//michael.merickel.org/projects/pyramid_auth_demo/



欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zaji/5661655.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存