【问题标题】:Check if Flask-HTTPAuth is authenticated inside view检查 Flask-HTTPAuth 是否在视图内通过身份验证
【发布时间】:2017-04-30 08:03:49
【问题描述】:

我正在使用 Flask-HTTPAuth 进行身份验证。我想根据请求是否经过身份验证从视图中显示不同的数据。使用auth.login_required 装饰视图仅向经过身份验证的用户显示。如何测试请求是否通过 Flask-HTTPAuth 进行了身份验证?

auth = HTTPBasicAuth()

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

【问题讨论】:

  • 我不知道您是否可以使用 flask-httpauth 执行此操作,因为您需要将一个对象传递给您的模板,该对象包含用户经过身份验证的信息。我知道你绝对可以用Flask-Login 做到这一点,见这里stackoverflow.com/questions/18361151/…

标签: python flask flask-httpauth


【解决方案1】:

您可以使用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

另见Default login_required rather than adding decorator everywhere

【讨论】:

    【解决方案2】:

    你想要的其实很容易实现。在您的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)
    

    【讨论】:

    • 这个答案现在已经过时了。使用optional 参数。见my answer
    【解决方案3】:

    自 2020 年 4 月以来,事情变得更简单了。

    Flask-HTTPAuth 4.0.0 将 optional 参数添加到 login required 以做到这一点。

    来自the docs

    一个可选的可选参数可以设置为 True 以允许在请求中不包含身份验证时也执行路由,在这种情况下 auth.current_user() 将设置为 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')
    

    【讨论】:

      猜你喜欢
      • 2017-09-11
      • 2023-03-04
      • 2017-07-10
      • 2017-07-15
      • 2022-09-29
      • 2018-12-28
      • 2014-09-22
      • 1970-01-01
      相关资源
      最近更新 更多