根据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),但正如我所提到的,我没有将我的用户存储在数据库中......它们已经存在于不同的数据库中
答案 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
中。