Python 金字塔中的认证/授权实现

Python 金字塔中的认证/授权实现,python,security,pyramid,Python,Security,Pyramid,我已遵循文档 写下这些: def groupfinder(userid, request): print '#'*80 print userid role = DBSession.query(Role).... if role.name == "Admin": return ['g:admin'] class RootFactory(object): __acl__ = [ (Allow, Everyo

我已遵循文档
写下这些:

def groupfinder(userid, request):
    print '#'*80
    print userid
    role = DBSession.query(Role)....

    if role.name == "Admin":
        return ['g:admin']


class RootFactory(object):
        __acl__ = [
            (Allow, Everyone, 'view'),
            (Allow, Authenticated, 'edit'),
            (Allow, 'g:admin', 'admin')
        ]

        def __init__(self, request):
            pass


authn_policy = AuthTktAuthenticationPolicy(
    settings['auth.secret'],
    callback=groupfinder,
)
它工作正常,但加载的每个页面都会重复查询数据库
用户首次登录时是否应返回权限?
或者也许我做得不对


我怎么知道像mako这样的模板中的权限“g:admin”

你的
groupfinder
现在有一个微妙的bug。如果用户有效,它应该总是返回一个列表。只有在没有用户的情况下,才会返回
None
。现在,如果用户是管理员,您只会返回一个列表,因此普通用户永远不会被识别

def groupfinder(userid, request):
    print '#'*80
    print userid
    role = DBSession.query(Role)....

    if role is not None:
        principals = []
        if role.name == "Admin":
            principals.append('g:admin')
        return principals
注意我们总是返回一个列表,除非
role
None

接下来,您询问了性能。金字塔不会尝试缓存任何内容。但是,您可以自己轻松地处理此问题。执行此操作的典型方法是在包含
角色
用户
请求
对象上添加缓存(具体化)属性。这样,每次调用
groupfinder
时,您都将使用缓存的
角色,而不是再次查询它。这一模式得到了证明

我如何知道像mako这样的模板中的权限“g:admin”

嗯,‘g:admin’实际上是金字塔认证术语中的一个主体admin”(访问控制项的第三个元素)是权限。主体被视为一个实现细节,它只是帮助我们将事物映射到权限。最后,在处理访问/授权时,我们实际上只关心权限


要查看用户在模板中是否具有该权限,可以使用
pyramid.security.has\u permission('admin',request.context,request)
。您可以将
request.context
替换为任何具有
\uuuuuuacl\uuuuu
的对象,但
request.context
将是此场景中的
RootFactory
(这是您想要的)。

您的
groupfinder
现在有一个微妙的错误。如果用户有效,它应该总是返回一个列表。只有在没有用户的情况下,才会返回
None
。现在,如果用户是管理员,您只会返回一个列表,因此普通用户永远不会被识别

def groupfinder(userid, request):
    print '#'*80
    print userid
    role = DBSession.query(Role)....

    if role is not None:
        principals = []
        if role.name == "Admin":
            principals.append('g:admin')
        return principals
注意我们总是返回一个列表,除非
role
None

接下来,您询问了性能。金字塔不会尝试缓存任何内容。但是,您可以自己轻松地处理此问题。执行此操作的典型方法是在包含
角色
用户
请求
对象上添加缓存(具体化)属性。这样,每次调用
groupfinder
时,您都将使用缓存的
角色,而不是再次查询它。这一模式得到了证明

我如何知道像mako这样的模板中的权限“g:admin”

嗯,‘g:admin’实际上是金字塔认证术语中的一个主体admin”(访问控制项的第三个元素)是权限。主体被视为一个实现细节,它只是帮助我们将事物映射到权限。最后,在处理访问/授权时,我们实际上只关心权限

要查看用户在模板中是否具有该权限,可以使用
pyramid.security.has\u permission('admin',request.context,request)
。您可以将
request.context
替换为任何具有
\uuuuuuu acl\uuuuuuu
的对象,但
request.context
将是此场景中的
RootFactory
(这是您想要的)