烧瓶登录。我在哪里存储user_loader函数的用户来查找它们?

时间:2016-02-02 23:43:43

标签: python authentication flask flask-login

根据Flask的文件:

  

user_loader(回调):   这将设置从会话重新加载用户的回调。您设置的功能应该使用用户ID(unicode)并返回用户对象,如果用户不存在,则为None。

这个函数应该从哪里加载User对象?用户数据存储在会话中,但这不是用户对象,它只是关于用户的JSON信息块。如果不将用户对象存储在某些全局字典或其他内容中,我不知道该函数应该如何使用user_id并通过创建具有该id的新用户并将所有先前的映射都返回到之外的关联用户数据。

我应该提到我没有使用数据库(即使我遇到同样的问题 - 数据库也无法存储用户对象,它们只存储有关用户的数据),因为我使用的是存储在其中的身份验证凭据LDAP服务器。

以下是一些代码:

    class User(object):

        def __init__(self, user_id, password, active=True, authenticated=False, anonymous=False):
            self.user_id = user_id.upper()
            self.password = password
            self.active = active
            self.authenticated = authenticated
            self.anonymous = anonymous

        def is_active(self):
            return self.active

        def is_anonymous(self):
            return self.anonymous

        def is_active(self):
            return self.active

        def is_authenticated(self):
            return self.authenticated

        def get_id(self):
            return self.user_id

和我的观看功能:

    @mod.route('/login', methods=['GET', 'POST'])
    def login():
        form = LoginForm(request.form)
        if request.method == 'POST' and form.validate():

            user_id = form.user_id.data
            password = form.password.data

            user = User(user_id=user_id, password=password)


            conn = get_ldap_connection(user.user_id, user.password)

            if conn:
                login_user(user)
                user.authenticated = True

                next = request.args.get('next')
                if next:
                    print("next: ", next)
                    return flask.abort(400)

            return redirect('/mmt')
        return render_template('auth/login.html', form=form)

我可以找到user_loader函数实现的每个示例都使用SQLALchemy.session.add(user),但正如我所提到的,我没有将我的用户存储在数据库中......它们已经存在于不同的数据库中

1 个答案:

答案 0 :(得分:1)

您不会将用户存储在会话中,而是存储唯一值以标识用户。然后使用该id加载用户。对于数据库,您将存储用户的主键,然后按该键进行查询。您可以使用LDAP执行完全相同的操作:在会话中存储一些唯一值,然后根据该值从LDAP加载。

用户只需要是一个继承自flask_login.UserMixin的对象(或者实现它所做的一切,而你的示例代码没有,_is属性应该是属性)。因此,您需要从LDAP加载记录并将该数据传递到User类以创建用户。

在登录视图中,根据从LDAP加载的记录创建用户对象,并使用它调用login_user(user)。 Flask-Login调用用户对象的get_id方法,以在登录cookie中存储唯一值。在后续请求中,Flask-Login调用user_loader以根据cookie中的值加载用户;此函数将执行LDAP查询并创建用户,类似于登录视图。您从user_loader返回的用户对象在请求期间存储在current_user中。