如何解决通过 Flask 和 Flask-Login 传递目标 URL
查看 Flask-Login 文档和 Stackoverflow 上几个相对较旧的线程,我担心通过登录过程传递受限页面 URL 的解决方案的安全性。
首先,我在尝试使用 @login_manager.unauthorized_handler
时遇到了归因错误。 (“login_manager
没有属性 unauthorized_handler
。”)这完全是一个单独的问题,因为它确实应该有效。 (请参阅下面的应用工厂。)
当我在没有修改 redirect_destination
的情况下应用 @login_manager.unauthorized_handler
函数时,登录无法重定向到目标目的地。
def redirect_destination(dest_url,fallback):
try:
dest_url = url_for(dest_url)
except:
return redirect(fallback)
return redirect(dest_url)
然后我应用了一个会话实例,通过登录从目标 URL 传递,以及 fresh_login_required
装饰器和 .is_authenticated
属性,而不是标准的 login_required
。
目标蓝图:
@target.route('/target',methods=['GET','POST'])
@fresh_login_required
def target():
if current_user.is_authenticated:
...
return render_template('target.html')
else:
session['dest_url']=request.endpoint
return redirect(url_for('account.login'))
身份验证蓝图:
@account.route('/login','POST'])
def login():
if current_user.is_authenticated:
return redirect(url_for('main.index'))
dest_url = session.get('dest_url')
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.username.data).first()
if not user:
return redirect(url_for('account.login'))
if user.check_password(form.password.data):
login_user(user,remember=form.remember_me.data)
...
return redirect_destination(dest_url,fallback=url_for('main.index'))
else:
return redirect(url_for('account.login'))
return render_template('account/login.html')
应用工厂:
...
login_manager = LoginManager()
login_manager.login_view = 'account.login' #hard-coded view
login_manager.refresh_view = 'account.refresh' #hard-coded view
def create_app():
app = Flask(__name__,static_url_path='/',static_folder='../app/static',template_folder='../app/templates')
db.init_app(app)
login_manager.init_app(app)
from app import models
from .templates.account import account
from .templates.main import main
from .templates.target import target
app.register_blueprint(main)
app.register_blueprint(account)
app.register_blueprint(target)
return app
因此,此解决方案有效,并且可以应用于多个蓝图。我担心的是我遗漏了一些需要其他更复杂解决方案的重要细节。是否存在安全弱点?其他问题?
参考文献:
https://flask-login.readthedocs.io/en/latest/
How do I pass through the "next" URL with Flask and Flask-login?
Flask/Werkzeug,how to return previous page after login
Flask how to redirect to previous page after successful login
Get next URL using flask redirect
Flask Basic HTTP Auth use login page
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。