使用金字塔

时间:2016-08-22 02:22:41

标签: pyramid identity

我正在构建一个金字塔应用程序。在“正常”使用中,用户必须使用典型的用户名/密码登录并执行大部分操作。 Pyramid文档使得剪切和粘贴非常容易,并且可以实现这一目标。

但是,现在我想将限制(权限和时间 - 权限在给定日期到期)扩展到我不想体验任何帐户/密码UI的人的编辑能力。我只想通过电子邮件向他们发送我生成的链接,当他们点击链接时,我希望他们登陆相关页面并获得识别并授权进行一些有限的更改。

所有明显的事情,如生成链接,将其存储在数据库中,关联用户名和到期日期,都没有问题。它正在插入Pyramid ident / auth框架,我不知道该怎么做。我做到这一点远没有真正理解他们的代码深入,我希望有人有一个代码示例,说明我想要做的事情,这可以让我继续不深入探讨这个话题。

或者,如果答案是停止懒惰并阅读文档,那么,我要花很少的钱。 : - )

1 个答案:

答案 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