我正在构建一个金字塔应用程序。在“正常”使用中,用户必须使用典型的用户名/密码登录并执行大部分操作。 Pyramid文档使得剪切和粘贴非常容易,并且可以实现这一目标。
但是,现在我想将限制(权限和时间 - 权限在给定日期到期)扩展到我不想体验任何帐户/密码UI的人的编辑能力。我只想通过电子邮件向他们发送我生成的链接,当他们点击链接时,我希望他们登陆相关页面并获得识别并授权进行一些有限的更改。
所有明显的事情,如生成链接,将其存储在数据库中,关联用户名和到期日期,都没有问题。它正在插入Pyramid ident / auth框架,我不知道该怎么做。我做到这一点远没有真正理解他们的代码深入,我希望有人有一个代码示例,说明我想要做的事情,这可以让我继续不深入探讨这个话题。
或者,如果答案是停止懒惰并阅读文档,那么,我要花很少的钱。 : - )
答案 0 :(得分:1)
创建随机数和到期日期并将其存储在数据库中。生成具有此编号的链接并将其发送给用户。检查单击链接时,其生成的随机数与数据库中的一个匹配。手动验证金字塔用户:
from pyramid.security import remember, forget
def authenticate_user(request, user)
if not user.can_login():
raise AuthenticationFailure('This user account cannot log in at the moment.')
# get_session_token_from_user() is your custom function.
# It usually returns user.id - it's the key how session backend maps sessions
# back to authenticated user.
token = get_session_token_from_user(user)
headers = remember(request, token)
# assert headers, "Authentication backend did not give us any session headers"
if not location:
location = get_config_route(request, 'websauna.login_redirect')
# Send any custom events related to user login your appplication cares of
e = events.Login(request, user)
request.registry.notify(e)
# Redirect user to the post-login form location
return HTTPFound(location=location, headers=headers)
对于做一次性电子邮件链接登录(如Slack或Medium)的特定用例,请参阅websauna.magiclogin addon。