Flask-principal 教程(auth + authr)[关闭]

Posted

技术标签:

【中文标题】Flask-principal 教程(auth + authr)[关闭]【英文标题】:Flask-principal tutorial (auth + authr) [closed] 【发布时间】:2011-10-26 09:08:27 【问题描述】:

有人知道关于烧瓶原理的好教程吗?我正在尝试进行身份验证和授权(needRole 和 needIdentity),但我没有得到任何结果。

我几乎可以肯定没有真正全面的教程 - 也许你们中的一些人有一些时间并想发布一个教程作为答案?我真的决定使用烧瓶而不是 django 但需要解决这个问题。

【问题讨论】:

对@InnocentPixel 的最终结果/学习内容有何评论?谢谢! @Jeff 看起来有人发布了一个不错的小教程作为答案! 还有this,现在也几岁了.... 【参考方案1】:

我知道这个问题有点老了,但几天前我一直在寻找同样的东西,所以希望这对未来的人有所帮助。 . .

the github repo for Flask-Principal 是一个不错的起点。

我在使用 Flask-Principal (FP) 时也遇到了一些问题。如果您是 decorators、context-managers 和 signals 的新手,您可能需要在使用 FP 之前对其进行一些研究。

Flask 基于名为Blinker 的包注册信号。如果您没有 Blinker,Flask 仍然允许您声明信号,但它们不会做任何事情。要了解我的意思,请查看 Flask 的 signals.py 的源代码。

那么为什么这对 FP 很重要?好吧,事实证明 FP 使用信号来注册和更新身份。具体来说:

    identity_loaded:当这个信号被调用时,我们知道要为用户创建一个身份对象。 (通过Principal._set_thread_identity()调用

    identity_changed:当这个信号被调用时,我们知道要更新用户的身份。 (当它被调用时执行 Principal._on_identity_changed()

那么我所说的称为是什么意思?首先,我们需要知道信号是如何设置的。 Blinker 通过允许函数“订阅”信号来工作。因此,例如,Principal._on_identity_changed() 被设置为信号identity_changed 的订阅者。每当发送信号identity_changed 时,就会执行_on_identity_changed()。代码如下所示:

from blinker import signal

test = signal('test') 
test.connect(func_we_want_to_execute_when_signal_is_called)

回到如何调用信号的问题。在 Blinker 中,当我们在信号对象上调用 send() 时,会执行信号处理程序。所以对于我们的test 信号,语法就是:

test.send()

test.send() 被调用时func_we_want_to_execute_when_signal_is_called 将执行。希望 FP 文档中的这个示例现在更有意义:

def login_view(req):
    username = req.form.get('username')
    # Your authentication here.

    # Notice our signal (identity_changed) is being called (identity_changed.send())
    # What function is being called? Principal._on_identity_changed()
    identity_changed.send(app, identity=Identity(username)) 

但是,如果我们使用装饰器为我们做这件事,我们可以简化设置信号。再次假装我已经设置了我的测试信号但还没有连接它。我们可以这样做:

@test.connect
def func_we_want_to_execute_when_signal_is_called():
    return stuff

上面的代码所做的基本上是设置我们在发送测试信号时要执行的函数。希望现在 FP 文档中的以下代码有意义:

# We're setting up our signal (identity_loaded) 
# to execute the function below (on_identity_loaded) 
# when we call our signal (identity_loaded.send())
# which is called in Principal._set_thread_identity()
@identity_loaded.connect 
def on_identity_loaded(sender, identity):
    # Get the user information from the db
    user = db.get(identity.name)

    # Update the roles that a user can provide
    for role in user.roles:
        identity.provides.add(RoleNeed(role.name))

    # Save the user somewhere so we only look it up once
    identity.user = user

因此,您可以看到信号真正推动了身份识别过程。如果您正在寻找一种方法来进行任何类型的授权,那么角色和权限确实是(更容易)事后才想到的。

对我来说,将我的头绕在信号上是最难的部分;我希望这对其他人也有帮助。但我真的鼓励你通读我上面为 Flask-Principal 链接的源代码;这可能是了解正在发生的事情的最佳方式。

【讨论】:

对我来说仍然不清楚,但非常感谢您的意图和努力【参考方案2】:

似乎只有this blog post。

web site of the project 是一个(非常简短的)教程,后面附有完整的 API 文档。你的问题表明你已经看到了。

您可能还对提供会话管理的flask-login 感兴趣,链接的博客文章也对此进行了介绍。

这里的任何人都不太可能有经验(以及详细分享的时间),但我完全赞成以教程为答案。

【讨论】:

我看到了那个教程,它让我..想要更多(我仍然不知道这么多)。 flask-login 只登录,我也想要授权(角色需要和身份需要)。我会将它用于网站使用和需要授权的休息 api。一个好主意是使用服务器端会话来确保 api 仅限于注册用户。是的,我看到了该项目的网站,但我正在寻找一个直截了当的手把手演练,这样我就可以填补我的知识空白。 是的,不幸的是,我认为目前不存在。我唯一的建议是定期编辑帖子添加更多信息(这会在“活动”选项卡上颠簸它,但不要只是编辑颠簸)。如果您在两天内没有得到好的答案,您可以在问题中添加赏金以将其添加到“精选”选项卡中,并希望您能幸运地遇到想要学习然后发布的人,或者使用过的人过去。 感谢 agf 的话 :) 我一定会这样做的。【参考方案3】:

出于某种原因,关于烧瓶原理的示例很少。我个人发现 Flask-Principal 文档一开始就很神秘。一旦我浏览了源代码,一切似乎都更好地适应了。

受我能够找到的这两个链接here 和here 的启发,我使用flask-login、flask-principals 和蓝图组合了一个简单的示例

https://github.com/shankararul/flask-login-principal

我已尽力在此帖子中进行解释。如果您有任何反馈,请告诉我,我可以修改/更新帖子

https://medium.com/@shankararul/a-shot-at-demystifying-flask-principal-dda5aaeb6bc6

【讨论】:

以上是关于Flask-principal 教程(auth + authr)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

APNS auth key制作教程

是否有一种简单的方法可以在烧瓶中使会话超时?

laravel Auth::check() 失败

一个小白对auth的理解

WEB前端教程——2016 版 Laravel 系列入门教程

Auth0 NodeJS JWT 身份验证在移动应用程序的 API 中