检查烧瓶-Httpauth是否在视图内进行身份验证



我正在使用玻璃HTTPAUTH进行身份验证。我想根据请求是否经过身份验证,从视图显示不同的数据。用auth.login_required装饰视图仅显示给经过身份验证的用户。如何测试是否用烧瓶-Httpauth对请求进行身份验证?

auth = HTTPBasicAuth()
@app.route("/clothesInfo")
@auth.login_required
def show_info():
    return jsonify(blah blah blah)

您想要的实际上很容易实现。在您的verify_password回调中,当用户不提供凭据时,您将获取用户名和密码设置为''。您仍然可以从该功能返回True,这将允许匿名用户访问端点。

以下示例演示了此技术:

auth = HTTPBasicAuth()
@auth.verify_password
def verify_password(username, password):
    if username == '' or password == '':
        # anonymous user, we still let them in
        g.current_user = None
        return True
    g.current_user = my_verify_function(username, password)
    return g.current_user is not None
@app.route("/clothesInfo")
@auth.login_required
def show_info():
    if g.current_user:
        # prepare data for authenticated users here
        pass
    else:
        # prepare data for anonymous users here
        pass
    return jsonify(data)

您可以装饰使用login_required返回None的函数。在未身份验证的情况下调用它将返回错误响应,而在身份验证的同时将其返回None

# a dummy callable to execute the login_required logic
login_required_dummy_view = auth.login_required(lambda: None)
def is_authenticated():
    try:
        # default implementation returns a string error
        return login_required_dummy_view() is None
    except HTTPException:
        # in case auth_error_callback raises a real error
        return False
@app.route('/info')
def info():
    if is_authenticated():
        # logged in view
    else:
        # basic view

另请参见默认的login_required,而不是到处添加装饰器。

事情自2020年4月以来更简单。

Blask-Httpauth 4.0.0添加了optional参数到login required做到这一点。

来自文档:

可以将可选的可选参数设置为true,以允许在请求中不包含身份验证时,也可以执行执行路由,在这种情况下,将设置为none。示例:

@app.route('/private')
@auth.login_required(optional=True)
def private_page():
    user = auth.current_user()
    return "Hello {}!".format(user.name if user is not None else 'anonymous')

相关内容

  • 没有找到相关文章

最新更新