由于官方的flask_login 是基于用户ID来存储当前登录用户的,如官方demo:
如果有多个用户角色,比如有父账户和子账户,在同一个浏览器下,父账号登陆了,此时访问子账号的后台,也是登录状态,因为是基于ID来查询用户的,当然也可以让2个角色的用户ID不冲突,或者参考 flask_login_multi
我的需求也是实现用户后台登录不冲突,登陆了父账户,即使子账户存在同样的用户ID,访问子后台,任需登录,于是产生了一下解决办法,
@login_manager.user_loader
def load_user(user_id):
session_blueprint = session.get('blueprint')
if session_blueprint == request.blueprint == 'sub':
sub_user = SubUser.query.get(int(user_id))
return sub_user
elif session_blueprint == request.blueprint == 'home':
home_user = User.query.get(int(user_id))
return home_user
else:
return None
另外在父账户登录时设置:
# 记录当前登录的endpoint
session['blueprint'] = request.blueprint
子账户同理:
# 记录当前登录的endpoint
session['blueprint'] = request.blueprint
由于登录的时候才会设置这个值,所以当你登录了父账户,输入子账户的后台链接,
session_blueprint == request.blueprint == 'sub':
session_blueprint=home,判断不成立,
session_blueprint == request.blueprint == 'home'
而 request.blueprint=sub ,同样判断不成立
返回None,则跳转到登录页,避免了因账户ID相同产生未登录也能访问后台的BUG。
以上!