Flask 和 Auth0 - 如何检查用户是否在 Jinja 中通过身份验证

Flask and Auth0 - How to check if user is authenticated in Jinja

我在我的 Flask 应用程序中使用 Auth0 进行身份验证,想知道如何检查用户是否在 Jinja 模板中进行了身份验证。

我想知道是否有一种方法可以做一些类似于 LoginManager 的事情:

{% if current_user.is_anonymous %} #<-- This here
<li><a href="{{ url_for('login') }}">Login</a></li>
{% else %}
<li><a href="{{ url_for('user', username=current_user.username) }}">Profile</a></li>
<li><a href="{{ url_for('logout') }}">Logout</a></li>
{% endif %}

你有两个选择:

  • 使用全局 g 对象 在模板中自动可用 before_app_request 挂钩,阅读官方 Flask tutorial:
@bp.before_app_request
def load_logged_in_user():
    """If a user id is stored in the session, load the user object from
    the database into ``g.user``."""
    user_id = session.get("user_id")

    if user_id is None:
        g.user = None
    else:
        g.user = (
            get_db().execute("SELECT * FROM user WHERE id = ?", (user_id,)).fetchone()
        )

然后在您的模板中:

{% if g.user %}
  <li><span>{{ g.user['username'] }}</span>
  <li><a href="{{ url_for('auth.logout') }}">Log Out</a>
{% else %}
  <li><a href="{{ url_for('auth.register') }}">Register</a>
  <li><a href="{{ url_for('auth.login') }}">Log In</a>
{% endif %}
  • 将你的 current_user 对象注入到 context processorflask-login 是你的好灵感(没有装饰器):
[..]

def _get_user():
    if has_request_context() and not hasattr(_request_ctx_stack.top, 'user'):
        current_app.login_manager._load_user()

    return getattr(_request_ctx_stack.top, 'user', None)

[..]

def _user_context_processor():
    return dict(current_user=_get_user())

然后获取当前应用程序(在您的情况下可能需要导入 current_app 对象)

[..]
    app.context_processor(_user_context_processor)

然后你可以使用 current_user 比如 :

{% if current_user.is_anonymous %} #<-- This here
<li><a href="{{ url_for('login') }}">Login</a></li>
{% else %}
<li><a href="{{ url_for('user', username=current_user.username) }}">Profile</a></li>
<li><a href="{{ url_for('logout') }}">Logout</a></li>
{% endif %}