系统环境:Ubuntu 18.04.1 LTS

Python使用的是虚拟环境:virutalenv

Python的版本:Python 3.6.9

【简说Python WEB】用户身份验证--Werkzeug

基本大多数web应用都有用户身份验证。

基本的身份验证,要不是用户名,要不是电子邮件地址。加上自己的密码。完成身份验证。

这里就是做一个完整的用户身份验证系统

Flask的security扩展

  • FLask-Login:管理已经登录的用户会话
  • Werkzeug:计算密码散列值,同时进行check
  • itsdangerous:生成并check加密安全令牌

使用Werkzeug生成密码散列值

Werkzeug的security模块实现了散列值的计算。有两个函数,一个生成,另外一个核对

如下:

generate_password_hash(password,method='pbkdf2:sha256',salt_length=8)

三个输入参数:

  • 第一个参数: 输入密码
  • 第二个参数:pbkdf2_sha256加密验证算法
  • 第三个参数:salt值字符串长度。

pbkdf2_sha256 + SALT盐值加密,是很可靠的一种加密方式。

输入的值是一个密码,输出的值返回密码散列值的字符串。基本默认值就够用了。

check_password_hash(hash, password)

这个参数从数据库中取出密码的hash值和输入的密码值进行校对。如果返回为True说明输入的密码正确。

app/models.py加入Werkzeug密码散列值

from werkzeug.security import generate_password_hash, check_password_hash
class User(db.Model):
#..
password_hash = db.Column(db.String(128)) @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)

在shell测试上述代码:

(zsdpy1) zsd@zsd-virtual-machine:~/Zflask$ flask shell
Python 3.6.9 (default, Nov 7 2019, 10:44:02)
[GCC 8.3.0] on linux
App: app [production]
Instance: /home/zsd/Zflask/instance
>>> u = User()
>>> u.password = 'cat'
>>> u.password_hash
'pbkdf2:sha256:150000$bCVGWsku$752d59b87a450aac1b2ea9297e6475f2300fcdea4b589f788aa753e1a820c12d'
>>> u.verify_password('cat')
True
>>> u.verify_password('zsd')
False
>>> u2 = User()
>>> u2.password = 'cat'
>>> u2.password_hash
'pbkdf2:sha256:150000$oMmeJziP$92900571f3639e0dca770bbb94f83c64a22d3f510343446a32499c2f64783962'

可以看到u和u2的密码虽然都是cat,但是hash密码值确实不一样的。

这样手动写shell一步一步测试特别浪费时间,我们可以通过写单元测试,完成测试工作。如下:

tests/test_user_model.py 密码散列测试

import unittest
from app import create_app, db
from app.models import User class UserModelTestCase(unittest.TestCase):
def setUp(self):
self.app = create_app('testing')
self.app_context = self.app.app_context()
self.app_context.push()
db.create_all() def tearDown(self):
db.session.remove()
db.drop_all()
self.app_context.pop() def test_password_setter(self):
u = User(password='cat')
self.assertTrue(u.password_hash is not None) def test_no_password_getter(self):
u = User(password='cat')
with self.assertRaises(AttributeError):
u.password def test_password_verification(self):
u = User(password='cat')
self.assertTrue(u.verify_password('cat'))
self.assertFalse(u.verify_password('dog')) def test_password_salts_are_random(self):
u = User(password='cat')
u2 = User(password='cat')
self.assertTrue(u.password_hash != u2.password_hash)

执行下列命令,做单元测试 :

(zsdpy1) $ flask test
test_app_exists (test_basics.BasicsTestCase) ... ok
test_app_is_testing (test_basics.BasicsTestCase) ... ok
test_no_password_getter (test_user_model.UserModelTestCase) ... ok
test_password_salts_are_random (test_user_model.UserModelTestCase) ... ok
test_password_setter (test_user_model.UserModelTestCase) ... ok
test_password_verification (test_user_model.UserModelTestCase) ... ok ----------------------------------------------------------------------
Ran 6 tests in 2.760s

这样就相当于自动化测试,直接测试了刚刚shell做得测试工作。

【简说Python WEB】用户身份验证--Werkzeug的更多相关文章

  1. Python tkinter 实现简单登陆注册 基于B/S三层体系结构,实现用户身份验证

    Python tkinter 实现简单登陆注册 最终效果 开始界面 ​ 注册 登陆 ​ 源码 login.py # encoding=utf-8 from tkinter import * from ...

  2. IdentityServer4 使用OpenID Connect添加用户身份验证

    使用IdentityServer4 实现OpenID Connect服务端,添加用户身份验证.客户端调用,实现授权. IdentityServer4 目前已更新至1.0 版,在之前的文章中有所介绍.I ...

  3. MVC4商城项目二:用户身份验证的实现

    用户身份验证,依赖于 forms 身份验证类:FormsAuthentication,它是一串加密的cookie 来实现对控制器访问限制和登陆页面的访问控制.它在浏览器端是这样子的: 需求:我们要实现 ...

  4. asp.net用户身份验证时读不到用户信息的问题 您的登录尝试不成功。请重试。 Login控件

    原文:asp.net用户身份验证时读不到用户信息的问题 您的登录尝试不成功.请重试. Login控件 现象1.asp.net使用自定义sql server身份验证数据库,在A机器新增用户A,可以登录成 ...

  5. 【转载】IdentityServer4 使用OpenID Connect添加用户身份验证

    使用IdentityServer4 实现OpenID Connect服务端,添加用户身份验证.客户端调用,实现授权. IdentityServer4 目前已更新至1.0 版,在之前的文章中有所介绍.I ...

  6. 第11章 使用OpenID Connect添加用户身份验证 - Identity Server 4 中文文档(v1.0.0)

    在本快速入门中,我们希望通过OpenID Connect协议向我们的IdentityServer添加对交互式用户身份验证的支持. 一旦到位,我们将创建一个将使用IdentityServer进行身份验证 ...

  7. asp.net的forms身份验证 单用户身份验证

    asp.net的forms身份验证  单用户身份验证 首先要配置Web.config文件 <system.web> <authentication mode="Forms& ...

  8. 【简说Python WEB】Flask应用的文件结构

    目录 [简说Python WEB]Flask应用的文件结构 1.文件结构的目录 2.配置程序--config.py 3.app应用包 4.剥离出来的email.py 5.蓝本(BLueprint)的应 ...

  9. 【简说Python WEB】数据库

    目录 [简说Python WEB]数据库 数据库表 docker安装MySQL Flask-SQLAlchemy操纵MySQL数据库 初始化 定义模型 定义关系 数据库的CRUD操作 创建表 inse ...

  10. 【简说Python WEB】Web应用部署

    目录 [简说Python WEB]Web应用部署 应用层 缓存层 数据层 Gunicorn 的应用 1.安装Gunicorn 2.Gunicorn的启动 Nginx 的应用 1.docker方式部署安 ...

随机推荐

  1. ZYNQ7000系列学习之TF卡读写(2)

    ZYNQ读写实验(2) 1.实验原理 在TF卡读写实验1中,已经将每一个步骤都做完了,但是最后得到的结果是错误的.那个时候由于TF没有格式化,显示的是错误信息.在格式化后,再次实验,得到了预期的结果. ...

  2. Python实现结巴分词统计高频中文词汇

    代码 1 # 读取文件 2 fn = open('youxi.txt', 'rt', encoding='utf-8') # 打开文件 3 string_data = fn.read() # 读出整个 ...

  3. #动态规划#CF889E Mod Mod Mod

    题目传送门 分析 这道题有一个很妙的地方就是将一段前缀整体一起做. 设 \(dp[i][j]\) 表示\(x\) 被前 \(i\) 个数取模后答案最大,并且 \(j\) 为取得此答案的最大值 最后再对 ...

  4. #KMP,矩阵乘法#洛谷 3193 [HNOI2008]GT考试

    题目 给定\(n,m,K\)和一个长度为\(m\)的数\(x\), 问有多少个\(n\)位数满足任意一段不与\(x\)完全相同,可含前导0 \(n\leq 10^9,m\leq 20\) 分析 设\( ...

  5. npm 直接安装 GitHub/GitLab 仓库代码及 npm link 本地调试

    一.npm 直接安装 GitHub/GitLab 仓库代码 语法 npm install <git remote url> 示例 命令: npm i git@github.com:maze ...

  6. OpenHarmony 3.2 Beta多媒体系列——音视频播放框架

      一.简介 媒体子系统为开发者提供一套接口,方便开发者使用系统的媒体资源,主要包含音视频开发.相机开发.流媒体开发等模块.每个模块都提供给上层应用对应的接口,本文会对音视频开发中的音视频播放框架做一 ...

  7. 阿里开源的32B大模型到底强在哪里?

    阿里巴巴最近开源了一个320亿参数的大语言模型Qwen1.5-32B,网上都说很强很强,那么它到底强在哪里呢? 更高的性价比 Qwen1.5-32B中的B是billion的意思,也就是10亿,32B就 ...

  8. 宝塔面板配置MongoDB数据库

    1-安装MongoDB 在面板中的[软件商店]搜索MongoDB并安装,推荐下载4.x以上的版本(可视化工具MongoDB Compass对高版本兼容比较好). 下载完成后,可以点击[设置],[版本切 ...

  9. Mysql之GTID

    一.GTID Mysql5.6引入GTID(Global Transaction IDs),多线程复制: 由服务器的UUID和事务ID号组成唯一标识某一个主机的某个事务的ID号: 每一个事务首部都有G ...

  10. Docker之离线安装和在线安装

    一.离线安装 1.软件包下载 https://download.docker.com/linux/static/stable/x86_64/ 2.安装docker tar xvf /opt/docke ...