栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

金字塔授权的存储项目

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

金字塔授权的存储项目

您可以使用

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/



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/659588.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号