【问题标题】:Flask Security unauthorized callbackFlask Security 未经授权的回调
【发布时间】:2020-08-19 10:56:11
【问题描述】:

我正在使用 Flask-Security 扩展程序,但我一生都无法弄清楚在扩展程序初始化时我可以在扩展程序中的哪个位置传递未经授权的处理程序。这对我很重要,因为我不想在用户没有所需权限时将他们重定向到另一个端点。我希望他们在他们所在的 url 中看到它,因此他们保留他们无权访问的 url 的上下文。我的解决方法是在第一个请求到来之前将方法修补到扩展上:

@app.before_first_request
def monkey_patch():
    """Monkey patching the flasksecurity callback"""
    current_app.extensions['security']._unauthorized_callback=lambda: abort(401)

然后我使用我的 app.errorhandler 处理错误并返回适当的响应代码。

@app.errorhandler(401)
def unauthorized(e):
    return 'You not authorized to visit this page', 401

有人知道更好的方法吗?

【问题讨论】:

    标签: python flask flask-security


    【解决方案1】:

    我有同样的问题 - 一旦用户尝试访问受限区域,我希望我的应用程序返回 JSON 对象,而不是重定向到 login 页面。看起来Flask-Security 不提供开箱即用的此类功能。幸运的是,它重用了 Flask-Login 并将其公开为烧瓶应用程序的成员。

    这就是它的工作原理。现在,一旦用户尝试访问使用 login_required 装饰器保护的 API 端点,它就会返回 JSON 对象。

    @app.login_manager.unauthorized_handler
    def unauth_handler():
        return jsonify(success=False,
                       data={'login_required': True},
                       message='Authorize please to access this page'), 401
    

    希望对您有所帮助!

    更新:我对功能进行了一些更新,使其更加通用。如果传递的请求是 AJAX 则它以 JSON 对象响应,否则以呈现的页面。

    @app.login_manager.unauthorized_handler
    def unauth_handler():
        if request.is_xhr:
            return jsonify(success=False,
                           data={'login_required': True},
                           message='Authorize please to access this page.'), 401
        else:
            return render_template('errors/401.html'), 401
    

    【讨论】:

    • 在这种情况下,app 到底是什么?我问是因为 Flask 应用程序没有login_manager;至少我的 PyCharm 声称它。
    • @Thomas 当然没有。 app 是 Fl​​ask 的全部。 login_managerFlask-Login 或(我用过的)Flask-Security 提供的注入对象。您必须自己安装和设置它。
    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多