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