Pyramid 中身份验证问题(remember + authenticated_userid)

2 投票
2 回答
4454 浏览
提问于 2025-04-16 14:20

我在使用Pyramid的基本认证机制时遇到了问题,似乎无法正常工作。我是不是做错了什么?

为了找出问题,我在我的一个视图中运行了这段代码:

print '$$$1', pyramid.security.remember(request, 12)
print '$$$2', pyramid.security.unauthenticated_userid(request)
print '$$$3', pyramid.security.authenticated_userid(request)

这是我得到的输出:

$$$1 [('Set-Cookie', 'auth_tkt="45a66a6e860356b991cc8fc8acf9bf7f4d8b3d2212!userid_type:int"; Path=/'), ('Set-Cookie', 'auth_tkt="45a66a6e860356b991cc8fc8acf9bf7f4d8b3d2212!userid_type:int"; Path=/; Domain=127.0.0.1:6543'), ('Set-Cookie', 'auth_tkt="45a66a6e860356b991cc8fc8acf9bf7f4d8b3d2212!userid_type:int"; Path=/; Domain=.127.0.0.1:6543')]

$$$2 None

$$$3 None

我确实可以使用request.session,所以我猜问题不在于cookies上。

这是我在__init__中用来配置Pyramid的代码:

authn_policy = AuthTktAuthenticationPolicy( 'secret', callback=lambda x:[])
engine = engine_from_config(settings, 'sqlalchemy.')
initialize_sql(engine)
my_session_factory = UnencryptedCookieSessionFactoryConfig('anothersecret')
config = Configurator(settings=settings, session_factory=my_session_factory,
                      authentication_policy=authn_policy,
        )

请帮帮我!

2 个回答

1

你可能在阅读教程时犯了和我一样的错误,认为group_finder只会返回额外的组。其实并不是这样,具体可以参考这里:http://plope.com/pyramid_auth_design_api_postmortem

如果你使用回调函数,它必须在用户无效时只返回None。教程中的例子会对任何不在列举用户中的用户返回None(即使你是通过其他方式验证用户的)。在我自己的代码中,我明确返回一个空列表([]),用于处理那些还不在记住的列表/组中的用户。这样我就有了三种访问级别:公开、已认证和基于组的权限。

除了教程中的例子,还有一组食谱条目可以参考:http://docs.pylonsproject.org/projects/pyramid_cookbook/dev/authentication.html

4

“remember” 只是返回一些头信息。你需要把这些头信息放到响应中。你可以查看 这个关于添加授权的文档部分,特别是第21和22行的代码示例。

撰写回答