Flask学习总结笔记(10) -- 利用Werkzeug实现账号密码加密存储
来源:互联网 发布:ubuntu chrome 编辑:程序博客网 时间:2024/06/06 04:22
在用户注册中,我们需要把账号密码存储到数据库中,为了账号安全,需要对密码进行加密。在Flask中,Werkzeug中的security模块能够很方便地实现密码加密计算。
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模型中添加一些密码验证的辅助代码:
#明文密码(只读)@propertydef password(self): raise AttributeError(u'文明密码不可读')#写入密码,同时计算hash值,保存到模型中@password.setterdef password(self,value): self.hashpass=generate_password_hash(value)#检查密码是否正确def check_login_password(self,password): return check_password_hash(self.hashpass,password)
0x03 验证视图
为了验证,定义如下表单:
#Login Formclass 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来完成密码加密存储,可以为我们节省很多工作量。
0 0
- Flask学习总结笔记(10) -- 利用Werkzeug实现账号密码加密存储
- 用flask开发个人博客(30)—— 用WerkZeug实现密码的加密存储
- Flask学习总结笔记(8) -- 利用Flask-mail实现电子邮件发送功能
- Flask学习记录之使用Werkzeug散列密码
- Flask学习总结笔记(11) -- 利用itsdangerous实现用户身份确认
- Flask学习总结笔记(9) -- 利用Flask-Login维护用户登录状态
- Werkzeug学习笔记
- Flask--哈希加盐-加密存储密码
- [存储] 利用SharedPreferences保存账号密码
- Flask学习总结笔记(12) -- 利用ajax进行前后端数据交互
- 【Flask】Flask实现密码存储安全性的两种方式
- 利用h5的本地存储实现登录页面里的记住账号和密码功能
- AD账号密码过期邮件提醒-powershell实现--密码加密(新增)
- 数据库账号密码加密
- Flask 学习笔记-- 10
- Android学习(20) -- 数据存储之SharedPreferences(存储账号密码)
- flask-SQLAlchemy数据库密码加密
- Flask学习总结笔记(1)-- 环境配置
- 设置ArcGIS的数据源
- caffe-windows引入Nugetpackage
- cache:annotation-driven" 的前缀 "cache" 未绑定
- android.mk文件
- IO流_throw的概述以及和throws的区别
- Flask学习总结笔记(10) -- 利用Werkzeug实现账号密码加密存储
- 局部线性回归
- freemarker、velocity、jsp的比较
- Redis---List数据类型操作
- fiddler的使用
- ios 性能优化
- 循环语句的实战演练
- jenkins credentials & git ssh 认证
- JVM内幕:Java虚拟机详解