欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Flask 中的登陆校验

程序员文章站 2022-04-18 09:31:34
...

请求的登陆校验是个常见的需求,如果使用 Flask 框架,一般会使用 flask-login 这个库,说说使用遇到几点问题

  • 怎么全局禁用login检查呢?

flask-login 提供了一个配置项 LOGIN_DISABLED, 开发和mock的时候有时候有这个需求。

app = Flask(__name__)
app.secret_key = "session secret key. TODO: store it securely"
app.config['LOGIN_DISABLED'] = True
  • how to handle view and blueprint login check ?

flask-login 提供了一个 view 级别的 decorator,login_required, 基本和 django 提供的类似

def login_required(func):
    @wraps(func)
    def decorated_view(*args, **kwargs):
        if request.method in EXEMPT_METHODS:
            return func(*args, **kwargs)
        elif current_app.login_manager._login_disabled:
            return func(*args, **kwargs)
        elif not current_user.is_authenticated:
            return current_app.login_manager.unauthorized()
        return func(*args, **kwargs)
    return decorated_view

那么要对 blueprint 做 loing check呢? blueprint 中提供了一个 before_request 的 hook,这里可以利用上

def bp_login_required():
    """
    usage:

    apibp = Blueprint('api', 'api_bp')
    apibp.before_request(bp_login_required)
    """
    if current_app.login_manager._login_disabled:
        pass
    # ajax not 302
    elif not current_user.is_authenticated:
        if request.is_xhr:
            abort(401)
        else:
            return current_app.login_manager.unauthorized()