flask web开发-用户认证部分代码分析(二)

来源:互联网 发布:飞升虫子升级数据 编辑:程序博客网 时间:2024/05/16 05:02

  出于安全的考虑,一般使用密码的散列值.在用户登录验证时只传递密码的散列值,散列值就算被截获也无法还原.只有拥有原密码,利用哈希加密再次生成的散列值进行对照,才能验证通过.
  Werkzeug中的安全模块可以实现密码生成散列值的功能.先来了解其中的两个函数.
  generate_password_hash(password, method= pbkdf2:sha1 ,salt_length=8) 这个函数获取输入的password,输出一串哈希加密后的散列值,后面的连个参数设置一般是默认,不写也是可以的.
  check_password_hash(hash, password)这里将password再次加密输出散列值和之前生成的散列值对照,来检验用户登录.这里需要注意下,同一个用户的密码多次加密生成的散列值一定是一样的,同样的密码不同的用户名那么就会产生不同的散列值.具体的生成机制太复杂,本人也没有仔细查,恳请各位读者赐教.app/templates/modle.py

@property    def password(self):        raise AttributeError('password is not a readable attribute')    @password.setter    def password(self, password):        self.password_hash = generate_password_hash(password)    def verify_password(self, password):        return check_password_hash(self.password_hash, password)

上面是modle部分,接下来简单用法展示

>>> u = User()>>> u.password = 'cat'>>> u.password_hash'pbkdf2:sha1:1000$duxMk0OF$4735b293e397d6eeaf650aaf490fd9091f928bed'>>> u.verify_password('cat')True>>> u.verify_password('dog')False>>> u2 = User()>>> u2.password = 'cat'>>> u2.password_hash'pbkdf2:sha1:1000$UjvnGeTP$875e28eb0874f44101d6b332442218f66975ee89'

上面只是在shell中测试下单元功能,在具体的程序块中用法如下:
登录路由函数使用GET,POST方法.

@auth.route('/login', methods=['GET', 'POST'])def login():    form = LoginForm() #创建对象    if form.validate_on_submit(): #验证表单数据的函数        user = User.query.filter_by(email=form.email.data).first()#根据用户填写的email来加载用户信息        if user is not None and user.verify_password(form.password.data):#如果用户存在,那么就调用验证函数,验证函数的内容见上一段程序            login_user(user, form.remember_me.data)#密码正确时调用,当为true时来实现记住密码功能,会把会话信息存放在浏览器的cookie中,以便下次复现.            return redirect(request.args.get('next') or url_for('main.index'))#重定向函数,在POST请求提交时运行.一般情况下把原网址存放在next函数中,如果登录成功直接跳转到原网址,如果查询字符串没有next参数,那么跳转到首页main.index        flash('Invalid username or password.')    return render_template('auth/login.html', form=form)#如果密码错误会显示一行flash然后重新渲染表单,让用户再次登录.如果用户名不存在,直接跳转到登陆界面,待用户下一步操作.

其实我们在进行登录验证之前app/modle.py中加载用户回调函数以及在auth/views.py中加入了路由保护,这是用来获取user.id来判断是否返回验证函数以及保护未授权的用户不能访问这个登录路由.具体的下次再说,还要说说如何写登陆界面,以及注册界面,路由和配置.

原创粉丝点击