首页 > 解决方案 > Flask-Principal 在调用 Flask-Login request_loader 之前需要触发异常

问题描述

一段时间以来,我使用 Flask-Login 来处理传统的用户名/密码身份验证请求,并使用 Flask-Principal 来处理针对后续请求的路由的授权检查。一切都很好。

我现在正在尝试利用 Flask-Login 的“request_loader”装饰器在命中受保护端点的同一请求中处理基于标头的身份验证。

我遇到的问题是 Flask-Principal 的“require”装饰器似乎在 Flask-Login 的“request_loader”之前执行。在下面的示例中,我什至在代码尝试验证用户身份之前就触发了 403 Unauthorized HTTP Exception。

考虑到基于标头的身份验证,我一定错过了一些愚蠢的东西——我相信——因为它在任何端点授权检查之前执行......

烧瓶登录使用:

login_manager = LoginManager(app)
login_manager.anonymous_user = User
login_manager.session_protection = 'strong'
@login_manager.request_loader
def load_user_from_request(request):
    # do stuff, return User if found

Flask 主要用途:

@blueprint.route('/some/endpoint', methods=['GET'])   
@read_permission.require(http_exception=403)
def some_function():
    # Do stuff

编辑:

附带说明一下,Flask 的“before_request”函数似乎在任何其他函数之前被调用,所以理论上,我可能能够从那里处理基于标头的身份验证,但不使用 Flask-Login 函数似乎很脏为此目的而设计...

标签: pythonpython-3.xflask-loginflask-principal

解决方案


我终于将身份验证逻辑移到了 @app.before_request 函数中,并且确实有效,所以我会将其标记为答案,直到出现更好的结果。


推荐阅读