Skip to main content
 首页 » 编程设计

python之Pyramid 中的身份验证/授权实现

2025年05月04日16oomusou

我已遵循文档 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”

请您参考如下方法:

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

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

how do I know the permission "g:admin" in templates like mako

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

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