Flask-principal教程(auth +作者)

时间:2011-08-13 11:28:38

标签: python authentication authorization flask

有人知道关于flask-principal的好教程吗?我试图进行身份验证和授权(needRole和needIdentity),但我还没有到达任何地方。

我几乎肯定没有真正全面的教程 - 也许你们中的一些人有一些时间在他们手上,并希望发布一个教程作为答案?我真的决心用烧瓶代替django,但需要解决这个问题。

3 个答案:

答案 0 :(得分:49)

我知道这个问题有点陈旧,但几天前我一直在寻找同样的事情,所以希望这将有助于未来的某些人。 。 。

一个好的起点是the github repo for Flask-Principal

我也遇到过Flask-Principal(FP)的问题。如果您是decoratorscontext-managerssignals的新手,您可能希望在使用FP之前稍微研究一下。

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

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

  1. identity_loaded:当调用此信号时,我们知道为用户创建一个标识对象。 (这是通过Principal._set_thread_identity()称为

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

  3. 那么被称为是什么意思?首先,我们需要知道如何设置信号。 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链接的源代码;它可能是理解正在发生的事情的最佳方式。

答案 1 :(得分:6)

那里唯一一个似乎是this blog post

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

您可能也对提供会话管理的flask-login感兴趣,并在链接的博客文章中也有介绍。

这里的任何人都不太可能有这方面的经验(以及分享细节的时间),但我只是为了一个教程作为答案。

答案 2 :(得分:5)

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

受到我能够找到的这两个链接herehere的启发,我使用flask-login,flask-principals和blueprints将一个简单的例子放在一起

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

我尽力在这里解释这篇文章。如果您有任何反馈,请告诉我,我可以修改/更新帖子

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