Flask-login登录成功后未跳转/home反而退回登录页问题求助
问题根因
你遇到的问题核心是Flask-Login的user_loader回调实现错误,导致登录后后续请求无法正确加载用户身份,被判定为未授权:
user_loader的输入参数是用户ID(即User.get_id()方法返回的内容),而非用户对象,你的原代码中该函数内部使用了未定义的username、password变量实例化User,必然返回None,Flask-Login就会判定用户未登录。- 你在
User.is_authenticated()中每次调用都发起LDAP校验,但user_loader执行时根本拿不到用户密码,就算修复变量问题也会校验失败。 - 全局变量
user_login存在多用户串权风险,应该用Flask-Login提供的current_user获取当前登录用户。
修复步骤
1. 调整User类实现
修改get_id返回完整用户名,避免user_loader无法还原用户身份,同时无需在非登录场景重复调用LDAP校验:
class User: def __init__(self, username, password=None): self.username = username self.password = password # 仅登录时调用该方法校验LDAP def validate_ldap(self): if not self.password: return False return LdapConn(ldap_server, self.username, self.password).confirm_login() # Flask-Login要求的属性,无需重复校验 @property def is_authenticated(self): return True @property def is_active(self): return True @property def is_anonymous(self): return False def get_id(self): # 返回完整用户名作为用户ID,方便user_loader加载 return self.username
2. 重写user_loader回调
直接根据用户ID返回User对象,无需重复校验:
@login_manager.user_loader def load_user(user_id): # 登录时已经校验过LDAP,此处直接返回用户对象即可 return User(username=user_id)
3. 修正导入、登录视图和业务视图逻辑
替换全局用户变量,同时支持登录后跳转到登录前访问的页面:
注意需要在flask_login导入语句中添加
current_user:from flask_login import LoginManager, login_user, login_required, current_user
@app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username=request.form['username'] password=request.form['password'] user_login=User(username, password) if user_login.validate_ldap(): login_user(user_login, remember=True) # 优先跳next参数指定的地址,没有的话跳home next_page = request.args.get('next') return redirect(next_page or url_for('home')) else: return render_template('login.html', error='<div class="error">Er is een probleem opgetreden.</div>') return render_template('login.html') @app.route('/home') @login_required def home(): # 用current_user获取当前登录用户,不要用全局变量 uid = current_user.get_id().split("\\")[-1] return render_template('base.html', uid=uid)
修复后即可正常登录跳转,同时支持登录后回到用户之前访问的需要权限的页面。
内容的提问来源于stack exchange,提问作者JS.SwadonBV
相关产品推荐
相关产品推荐

