金字塔中的身份验证/授权工具

时间:2013-01-24 06:34:18

标签: python security pyramid

我已遵循文档Group-Level Security
写下这些:

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”

1 个答案:

答案 0 :(得分:6)

您的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

请注意我们总是返回一个列表,除非roleNone

接下来,您询问了性能。金字塔不会尝试缓存任何内容。但是,您可以自己轻松处理此问题。执行此操作的典型方法是在包含requestrole的{​​{1}}对象上添加缓存(已知)属性。这样,每次调用user时,您都将使用缓存的groupfinder,而不是再次查询它。证明了这种模式here

  

我如何知道像mako

这样的模板中的权限“g:admin”

嗯'g:admin'实际上是Pyramid的身份验证术语中的主体。 'admin'(访问控制条目的第三个元素)是权限。 Principal被视为实现细节,只是帮助我们将事物映射到权限。最后,我们在处理访问/授权时非常关心权限。

要查看用户是否在您的模板中拥有该权限,您可以使用role。您可以将pyramid.security.has_permission('admin', request.context, request)替换为任何包含request.context的对象,但在此方案中__acl__将是您的request.context(这是您想要的)。