Flask 中的登陆校验

请求的登陆校验是个常见的需求,如果使用 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()

猜你喜欢

转载自blog.csdn.net/lzz957748332/article/details/79863068