2016-08-22 51 views
2

我正在构建金字塔应用程序。在“正常”使用情况下,用户必须使用典型的用户名/密码登录并执行任何操作。金字塔文档使剪切和粘贴变得非常简单,并使其发挥作用。金字塔中的临时URL的身份验证/授权

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

所有显而易见的东西,例如生成链接,将其存储在数据库中,关联用户名和过期日期都不成问题。它将它插入Pyramid ident/auth框架,我不知道该怎么做。我没有深入了解他们的代码,并且希望有人有我想要做的事情的代码示例,这样可以让我继续不去探索这个主题。

或者,如果答案是停止懒惰和阅读文件,那么,它花费我很少问。 :-)

+0

另一种看待这个问题的方法是,任何具有秘密链接的_anonymous_用户都可以编辑页面 - ta-da,根本不需要接触金字塔授权机器,只需公开“编辑。如果他们知道他们可以编辑的链接。 – Sergey

+0

一旦你指出,似乎很明显 - 谢谢@Sergey!我的情况稍微复杂一些,但你的观点仍然有助于清除我的想法。 –

回答

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) 

对于做一次电子邮件中的链接登录像松弛或中等请参阅websauna.magiclogin addon的具体使用情况。

+0

谢谢!你的代码是一个非常无痛的方式来学习更多关于Pyramid auth来做我需要的东西。 –