gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:15:57 26 4
gpt4 key购买 nike

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

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

接下来,您询问了性能。 Pyramid 不会尝试缓存任何东西。但是,您可以自己轻松处理。这样做的典型方法是在包含 roleuserrequest 对象上添加缓存(具体化)属性。这样,每次调用 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 在这种情况下(这是你想要的)。

关于python - Pyramid 中的身份验证/授权实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14495284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com