login_required编码的下一个参数,重定向失败

问题描述 投票:1回答:4

我正在使用Flask登录的@login_required装饰器来处理我的应用中的某些路线。在未登录的情况下导航至那些路线时,我将重定向至登录页面。到目前为止一切顺利。

重定向的网址如下所示:/login?next=%2Fusers看起来它用url编码了下一个参数,这在我所遇到的示例中没有见过。登录重定向到next后,始终会失败并退回到索引页面。我认为这是因为next是url编码的。

我应该以不同的方式去做吗?我只是开始深入研究Flask框架并研究示例,因此我对做事的最佳方法并不了解。

这是示例路线:

login_manager.login_view = 'login'

@app.route('users')  
@login_required  
def users():  
  return 'Test'

我的登录路线如下:

@app.route('/login')
def login():
  error = None
  next = request.args.get('next')
  if request.method == 'POST':
    username = request.form['username']
    password = request.form['password']

    if authenticate_user(username, password):
      user = User.query.filter_by(username=username).first()
      if login_user(user):
        flash("You have logged in")
        session['logged_in'] = True
        return redirect(next or url_for('index', error=error))
    error = "Login failed"
  return render_template('login.html', login=True, next=next, error=error)

提前感谢您的帮助。

python redirect flask flask-login login-required
4个回答
3
投票

我想通了,导航到受登录保护的路由(在此示例中为/ requests,将导致使用next参数重定向到登录页面。

/login?next=%2Frequests  

在我的登录模板中,我有这个:

<form action="{{ url_for('login') }}" method='POST'>

这导致表单在没有任何参数的情况下被发布到/login路线。删除action属性或将其更改为action=""会将表单发布到其自己的url,其中包括原始查询字符串。另一种选择是在url_for中包括next=next

<form action="{{ url_for('login', next=next) }}" method='POST'>

0
投票

您在这里:

import urllib


@app.route('/login')
def login():
    error = None
    next = urllib.unquote_plus(request.args.get('next'))
    ...

0
投票

[如果有人像我一样找到这个问题,这是对我有用的实现。问题在于登录名的POST表单仅用于/ login,从而导致下一个URL被丢弃。按照Kevan的建议,如果将next=request.args.get('next'))添加到登录表单的操作中,它将随其一起传递下一个参数。

我的登录功能内部

@app.route('/login', methods = ['GET', 'POST'])
def login():
    next = request.args.get('next')
    if request.method == 'POST':
        ...Confirm User...
            if next:
                return redirect(next)
            else:
                return redirect('/')

在我的登录表格内]

<form method="post" action="{{ url_for('login', next=request.args.get('next')) }}" enctype="multipart/form-data">

0
投票

出于安全考虑,应考虑对下一个参数进行检查,如中所建议的>

https://flask-login.readthedocs.io/en/latest/#login-example

© www.soinside.com 2019 - 2024. All rights reserved.