1

我已经按照文档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”

4

1 回答 1

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

注意我们总是返回一个列表,除非roleis None

接下来,您询问了性能。Pyramid 不会尝试缓存任何内容。但是,您可以自己轻松处理。request执行此操作的典型方法是在包含roleor的对象上添加缓存(具体化)属性user。这样每次groupfinder调用时,您将使用缓存role而不是再次查询它。这里演示了这种模式。

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

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

要查看用户是否在您的模板中拥有该权限,您可以使用pyramid.security.has_permission('admin', request.context, request). 您可以替换request.context为任何带有 的对象__acl__,但在这种情况下request.context将是您RootFactory的(这就是您想要的)。

于 2013-01-24T08:10:14.027 回答