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来判断是否返回验证函数以及保护未授权的用户不能访问这个登录路由.具体的下次再说,还要说说如何写登陆界面,以及注册界面,路由和配置.
阅读全文
0 0
- flask web开发-用户认证部分代码分析(二)
- Flask Web开发-用户认证部分代码分析(一)
- flask web开发-用户认证代码分析(三)
- flask-web开发-用户认证代码分析(四)
- flask web开发-用户验证代码分析(五)
- Flask Web 开发 用户认证
- Flask Web 开发 用户认证_2
- Flask Web 开发 用户认证_3
- Flask Web 开发 用户认证_4
- Flask Web 开发 用户认证_5
- Flask Web 开发 用户认证_6
- 《flask web开发》第八章 用户认证
- 用户认证(二)【使用Flask-Login认证用户】
- MVC用户认证web应用部分二
- flask-用户认证(上)
- flask-用户认证(下)
- [python3.6 flask web学习]Flask用户认证框架
- Flask Web 开发学习稿(二)
- java中关于String、StringBuffer和StringBuilder
- 一个子查询涉及的索引位置问题
- JS实现吸附(adsorption)效果
- Java拦截过滤器模式
- Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNest
- flask web开发-用户认证部分代码分析(二)
- 如何取数组的下标索引
- Linux 线程
- C#中如何获取某月最后一天
- 关于springboot的配置注册循序问题
- iOS 11开发教程(四)iOS11模拟器介绍一
- HTML5调用百度地图API进行地理定位实例
- TabLayout与ViewPager的联动使用
- android面试-java集合