Flask学习总结笔记(10) -- 利用Werkzeug实现账号密码加密存储
2017-01-17 19:29
851 查看
在用户注册中,我们需要把账号密码存储到数据库中,为了账号安全,需要对密码进行加密。在Flask中,Werkzeug中的security模块能够很方便地实现密码加密计算。
函数将原始密码作为输入参数,以字符串形式输出密码的散列值,method和salt_length一般采用默认值就可以了。
函数讲原始密码与加密后的hash进行对比,返回值为True表示输入的明文密码是正确的。
在Users模型中添加一些密码验证的辅助代码:
模板文件:
视图函数的处理过程如下:
访问效果如下:
当账号密码正确时,将发生跳转。上面的验证实例是在前面蓝本模型的基础上完成的。使用Werkzeug来完成密码加密存储,可以为我们节省很多工作量。
0x01 相关函数
generate_password_hash(password,method=pdkdf2:sha1,salt_length=8)
函数将原始密码作为输入参数,以字符串形式输出密码的散列值,method和salt_length一般采用默认值就可以了。
check_password_hash(hash,password)
函数讲原始密码与加密后的hash进行对比,返回值为True表示输入的明文密码是正确的。
0x02 数据模型
class Users(db.Model): __tablename__='users' id=db.Column(db.Integer,primary_key=True) username=db.Column(db.String(255),nullable=False,index=True) hashpass=db.Column(db.String(255),nullable=False)
在Users模型中添加一些密码验证的辅助代码:
#明文密码(只读) @property def password(self): raise AttributeError(u'文明密码不可读') #写入密码,同时计算hash值,保存到模型中 @password.setter def password(self,value): self.hashpass=generate_password_hash(value) #检查密码是否正确 def check_login_password(self,password): return check_password_hash(self.hashpass,password)
0x03 验证视图
为了验证,定义如下表单:#Login Form class LoginForm(Form): email=StringField(u'email',validators=[DataRequired, Length(1,64), Email()]) password=PasswordField(u'password',validators=[DataRequired]) remeber=BooleanField(u'remeber me')
模板文件:
{%extends 'base.html'%} {%import 'bootstrap/wtf.html' as wtf%} {%block title%}用戶登录{%endblock%} {%block page_content%} <div class="container"> <div class="page-header"> <h3>Login</h3> </div> <div class="col-lg-4"> {%for message in get_flashed_messages()%} <div class="alert alert-warning"> <button type="button" class="close" data-dismiss="alert">×</button> <span>{{message}}</span> </div> {%endfor%} <form method="post"> {{form.hidden_tag()}} {{wtf.form_field(form.email)}} {{wtf.form_field(form.password)}} <div class="checkbox"> <label>{{form.remeber}}remeber me</label> <a href="{{url_for('auth.request_reset_password')}}" class="pull-right">find password</a> </div> <button type="submit" class="btn btn-primary form-control">Login</button> </form> </div> </div> {%endblock%}
视图函数的处理过程如下:
#login @auth.route('/login/',methods=['POST','GET']) @auth.route('/',methods=['POST','GET']) def login(): if current_user.is_authenticated: return redirect(url_for('main.index')) form=LoginForm() if form.validate_on_submit(): user=db.session.query(Users).filter(Users.email==form.email.data).first() if user and user.check_login_password(form.password.data): login_user(user,form.remeber.data) return redirect(request.args.get('next') or url_for('main.index')) else: flash('email or password is error') return render_template('auth/login.html',form=form)
访问效果如下:
当账号密码正确时,将发生跳转。上面的验证实例是在前面蓝本模型的基础上完成的。使用Werkzeug来完成密码加密存储,可以为我们节省很多工作量。
相关文章推荐
- 用flask开发个人博客(30)—— 用WerkZeug实现密码的加密存储
- Flask学习总结笔记(8) -- 利用Flask-mail实现电子邮件发送功能
- Flask学习总结笔记(12) -- 利用ajax进行前后端数据交互
- 利用h5的本地存储实现登录页面里的记住账号和密码功能
- Flask学习总结笔记(9) -- 利用Flask-Login维护用户登录状态
- 利用TEA算法实现加密密码文件生成与解密
- MySQL存储过程和触发器的实现--数据库学习笔记
- Effective C# 学习笔记(四十一)使利用DynamicObject或IDynamicMetaObjectProvider接口实现数据驱动的动态类型
- 企业库EnterpriseLibrary学习笔记之--通过企业库Microsoft.Practices.EnterpriseLibrary,实现调用存储过程的封装
- Android开发学习笔记:Button事件实现方法的总结
- 孙鑫VC学习笔记:第十六讲 (二) 利用关键代码段实现线程间的同步
- Java容器学习笔记(二) Set接口及其实现类的相关知识总结
- Effective C# 学习笔记(三十一)利用IComparable<T>和IComparer<T>接口来实现排序关系
- 算法导论学习笔记(4)——利用链接法实现哈希表
- 用户密码存储方案:中国XX银行业务系统中实现方法总结
- Java容器学习笔记(二) Set接口及其实现类的相关知识总结
- JavaScript学习笔记10--用js实现的拼图游戏
- TinyOS学习笔记10-节点与计算机利用串口通信1
- javascript学习笔记(七)利用javascript来创建和存储cookie
- 学习笔记---元数据、程序集、GAC版本控制、属性(Attribute)、反射(利用.NET编译器实现表达式计算器)