我已遵循文档 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 在这种情况下(这是你想要的)。
