8.6 访问权限控制与重定向攻击
1.在需要限制登录才能访问的试图函数上,加入@login_required装饰器
@web.route('/my/gifts')
@login_required
def my_gifts():
return "my gifts"
2.在User模型里,编写getuser 方法用来根据id查询用户,并加入@login_manager.user_loader 装饰器(login_manager是从app/\_init__.py中导入)
@login_manager.user_loader
def get_user(self, uid):
# 如果是根据主键查询,不要filter_by,使用get方法即可
return User.query.get(int(uid))
3.在app/__init__.py中,配置未登录时调整到的页面和提示消息
login_manager.login_view = 'web.login'
login_manager.login_message = '请先登录或注册'
4.登录成功以后,重定向到next页面;如果没有next页面,则跳转到首页;为了防止重定向攻击,应该判断next是否"/"开头
@web.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm(request.form)
if request.method == 'POST' and form.validate():
user = User.query.filter_by(email=form.email.data).first()
if user and user.check_password(form.password.data):
login_user(user, remember=True)
# request.form 获取表单信息;
# request.args获取url路径?后面的信息
next = request.args.get('next')
# next.startswith('/')防止重定向攻击
if not next or not next.startswith('/'):
return redirect(url_for('web.index'))
return redirect(next)
else:
flash("账号不存在或者密码错误")
return render_template('auth/login.html', form=form)
Last updated
Was this helpful?