iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中如何自定义密码验证
  • 872
分享到

Python中如何自定义密码验证

2023-06-29 06:06:08 872人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍“python中如何自定义密码验证”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中如何自定义密码验证”文章能帮助大家解决问题。下面是重构后的代码:from st

这篇文章主要介绍“python中如何自定义密码验证”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中如何自定义密码验证”文章能帮助大家解决问题。

下面是重构后的代码:

from string import (    ascii_lowercase, ascii_uppercase,    digits, punctuation, whitespace)    def contains_character(passWord: str = "", sack: str = "") -> bool:    has_char = False    for char in password:        if char in sack:            has_char = True            break    return has_char    def is_valid_size(password: str = "") -> bool:    MIN_SIZE = 6    MAX_SIZE = 20    password_size = len(password)    return MIN_SIZE <= password_size <= MAX_SIZE    def get_invalid_chars():    valid_chars = {'-', '_', '.', '!', '@', '#', '$', '^', '&', '(', ')'}    invalid_chars = set(punctuation + whitespace) - valid_chars    return "".join(invalid_chars)def is_valid_password(password: str = "") -> bool:    try:        if not password:            return False        new_password = password.strip()        if not is_valid_size(new_password):            return False        invalid_chars = get_invalid_chars()        if contains_character(new_password, invalid_chars):            return False        if not contains_character(new_password, digits):            return False        if not contains_character(new_password, ascii_lowercase):            return False        if not contains_character(new_password, ascii_uppercase):            return False        return True    except:        return False

我们的目标是为上面的代码片段编写单元测试。我们可以捕捉隐藏的错误,并在修复代码以通过测试时继续重构。

在测试:nut_and_bolt:️之前

有些事你应该知道:

  • 这将是一个单元测试

  • 我们将利用python的内置测试模块,unittest

  • 我们将测试,contains_character , is_valid_size和is_valid_password整齐

  • 测试将在test.py所以上面的片段可能在app.py(你选择你想要的名字)

  • 我们将参考

试验contains_character

contains_character返回bool,要么True或者False。所以我们可以使用assertTrue还有assertFalse方法。

我们将测试:

  • 如果既没有传递密码也没有传递sack(无参数)

  • 为了角色"i"在字符串中,"python"

  • 为了角色"py"在字符串中,"python"

  • 为了角色"python"在字符串中,"python"

有些情况下,比如int作为传递password或者当一个list作为传递sack。我们不会测试这种情况。(您应该为此进行测试)

TestContainsCharacter字符

import unittestfrom app import contains_characterclass TestContainsCharacter(unittest.TestCase):    def test_empty_password_or_and_empty_sack(self):        self.assertFalse(contains_character())    def test_char_i_in_str_python(self):        self.assertFalse(contains_character("i", "python"))    def test_str_py_in_str_python(self):        self.assertTrue(contains_character("py", "python"))    def test_str_python_in_str_python(self):        self.assertTrue(contains_character("python", "python"))if __name__ == "__main__":    unittest.main()

我们能击中ctrl + F5运行此脚本(test.py)无需调试。我们可以像下面这样运行这个脚本python3 test.py或者python3 -m unittest test.py。所有这些测试都应该通过。

试验is_valid_size

is_valid_size返回bool,要么True或者False。所以我们可以使用assertTrue还有assertFalse方法。

我们将测试:

  • 对于空密码或没有传递参数时

  • 四个字符的密码

  • 六个字符的密码

  • 十六个字符的密码

  • 二十个字符的密码

  • 21个字符的密码

TestIsValidSize

import unittestfrom app import is_valid_sizeclass TestIsValidSize(unittest.TestCase):    def test_empty_password(self):        self.assertFalse(is_valid_size(""))    def test_4_char_password(self):        self.assertFalse(is_valid_size("pass"))    def test_6_char_password(self):        self.assertTrue(is_valid_size("passwd"))    def test_16_char_password(self):        self.assertTrue(is_valid_size("ThisIs1Password!"))    def test_20_char_password(self):        self.assertTrue(is_valid_size("ThisIs1Password!+20"))    def test_21_char_password(self):        self.assertFalse(is_valid_size("ThisIs1Password!+20&"))if __name__ == "__main__":    unittest.main()

所有这些测试都应该通过。

试验is_valid_password

is_valid_password返回bool,要么True或者False。所以我们可以使用assertTrue还有assertFalse方法。

我们将测试:

对于空密码

三个字符的密码

十个字符的密码

二十个字符的密码

对于包含无效特殊字符(如分号)的密码

对于没有数字的密码

对于没有小写字母的密码

对于没有大写字母的密码

对于没有有效特殊字符的密码

对于有效的密码

  • 一个尺寸以内,[6-20]

  • 至少一个小写和大写字符

  • 至少一个数字

  • 没有无效的特殊字符

TestIsValidPassword

class TestIsValidPassword(unittest.TestCase):    def test_empty_password(self):        self.assertFalse(is_valid_password())    def test_password_of_size_three(self):        self.assertFalse(is_valid_password("pas"))    def test_password_of_size_ten(self):        self.assertFalse(is_valid_password("Password12"))        self.assertTrue(is_valid_password("Password1_"))    def test_password_of_size_twenty(self):        self.assertFalse(is_valid_password("Password12Password_$"))    def test_password_with_invalid_special_character_semicolon(self):        self.assertFalse(is_valid_password("Password1_;"))        self.assertFalse(is_valid_password("Password1;"))    def test_password_with_no_digit(self):        self.assertFalse(is_valid_password("Password_"))    def test_password_with_no_lowercase(self):        self.assertFalse(is_valid_password("PASSWORD1_"))    def test_password_with_no_uppercase(self):        self.assertFalse(is_valid_password("password1_"))    def test_password_without_valid_special_character(self):        self.assertFalse(is_valid_password("Password1"))    def test_valid_password(self):        self.assertTrue(is_valid_password("Password1_"))        self.assertTrue(is_valid_password("PassWord34$"))if __name__ == "__main__":    unittest.main()

不是所有的测试都通过了。这些测试用例不应该通过&mdash;&mdash;我们期望它们不会通过。所以当我们期待False我们得到True。某处存在缺陷或错误。

这些测试没有通过:

  • test_password_of_size_ten : self.assertFalse(is_valid_password("Password12"))应该是False因为即使大小有效,它也没有特殊字符。

  • test_password_without_valid_special_character : self.assertFalse(is_valid_password("Password1"))应该是False因为没有有效的特殊字符。

这is_valid_password函数不检查是否存在有效的特殊字符。它检查无效字符,但不检查有效字符。这是由有缺陷的假设造成的,即只要密码不包含无效字符,它就包含有效字符(包括有效的特殊字符)。

重构is_valid_password

既然我们已经指出了我们的bug,我们应该做出改变并重新运行测试。

要进行的更改:

在&hellip;里get_invalid_chars,我们有set有效的特殊字符,valid_chars。让我们让它对所有函数都是全局的(例如,把它从get_invalid_chars函数并将其放在函数的顶部)。为了确保某处没有损坏,运行测试(我们预计有两种情况会失败)。请注意,即使我们移动valid_chars由于get_invalid_chars , get_invalid_chars应该还能正常工作。

这valid_chars是一个set,它可以用作中的一组get_invalid_chars . contains_character需要一段时间string sack作为论据。我们必须解析valid_chars如同string。让我们在下面创建一个函数get_invalid_chars返回一个string版本valid_chars 

def get_valid_chars():    return "".join(valid_chars)

进行测试。

让我们检查中的有效字符is_valid_password通过在return True中的语句try封

if not contains_character(new_password, get_valid_chars()):    return False

进行测试。现在,所有的测试都通过了。万岁!!:clap:️:clap:️:clap:️

这更多的是重新排列代码is_valid_password在另一种环境中自然运行良好。我们将重新排列代码is_valid_password按此顺序分别为:size, lower case, upper case, digit, invalid special character and valid special character进行测试。

结论

这is_valid_password会在app.py类似于下面的代码片段:

from string import (ascii_lowercase, ascii_uppercase, digits, punctuation,                    whitespace)valid_chars = {'-', '_', '.', '!', '@', '#', '$', '^', '&', '(', ')'}def contains_character(password: str = "", sack: str = "") -> bool:    has_char = False    for char in password:        if char in sack:            has_char = True            break    return has_chardef is_valid_size(password: str = "") -> bool:    MIN_SIZE = 6    MAX_SIZE = 20    password_size = len(password)    return MIN_SIZE <= password_size <= MAX_SIZEdef get_invalid_chars():    invalid_chars = set(punctuation + whitespace) - valid_chars    return "".join(invalid_chars)def get_valid_chars():    return "".join(valid_chars)def is_valid_password(password: str = "") -> bool:    try:        if not password:            return False        new_password = password.strip()        if not is_valid_size(new_password):            return False        if not contains_character(new_password, ascii_lowercase):            return False        if not contains_character(new_password, ascii_uppercase):            return False        if not contains_character(new_password, digits):            return False        if contains_character(new_password, get_invalid_chars()):            return False        if not contains_character(new_password, get_valid_chars()):            return False        return True    except:        return False

单元测试将会在test.py类似于下面的代码片段:

import unittestfrom app import (contains_character, is_valid_size, is_valid_password)class TestContainsCharacter(unittest.TestCase):    def test_empty_password_or_and_empty_sack(self):        self.assertFalse(contains_character())    def test_char_i_in_str_python(self):        self.assertFalse(contains_character("i", "python"))    def test_str_py_in_str_python(self):        self.assertTrue(contains_character("py", "python"))    def test_str_python_in_str_python(self):        self.assertTrue(contains_character("python", "python"))class TestIsValidSize(unittest.TestCase):    def test_empty_password(self):        self.assertFalse(is_valid_size(""))    def test_4_char_password(self):        self.assertFalse(is_valid_size("pass"))    def test_6_char_password(self):        self.assertTrue(is_valid_size("passwd"))    def test_16_char_password(self):        self.assertTrue(is_valid_size("ThisIs1Password!"))    def test_20_char_password(self):        self.assertTrue(is_valid_size("ThisIs1Password!/+20"))    def test_21_char_password(self):        self.assertFalse(is_valid_size("ThisIs1Password!/+20&"))class TestIsValidPassword(unittest.TestCase):    def test_empty_password(self):        self.assertFalse(is_valid_password())    def test_password_of_size_three(self):        self.assertFalse(is_valid_password("pas"))    def test_password_of_size_ten(self):        self.assertFalse(is_valid_password("Password12"))        self.assertTrue(is_valid_password("Password1_"))    def test_password_of_size_twenty(self):        self.assertTrue(is_valid_password("Password12Password_$"))    def test_password_with_invalid_special_character_semicolon(self):        self.assertFalse(is_valid_password("Password1_;"))        self.assertFalse(is_valid_password("Password1;"))    def test_password_with_no_digit(self):        self.assertFalse(is_valid_password("Password_"))    def test_password_with_no_lowercase(self):        self.assertFalse(is_valid_password("PASSWORD1_"))    def test_password_with_no_uppercase(self):        self.assertFalse(is_valid_password("password1_"))    def test_password_without_valid_special_character(self):        self.assertFalse(is_valid_password("Password1"))    def test_valid_password(self):        self.assertTrue(is_valid_password("Password1_"))        self.assertTrue(is_valid_password("PassWord34$"))if __name__ == "__main__":    unittest.main()

关于“Python中如何自定义密码验证”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网Python频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Python中如何自定义密码验证

本文链接: https://www.lsjlt.com/news/323043.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python中如何自定义密码验证
    这篇文章主要介绍“Python中如何自定义密码验证”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中如何自定义密码验证”文章能帮助大家解决问题。下面是重构后的代码:from st...
    99+
    2023-06-29
  • 详解Python中的自定义密码验证
    目录在测试:nut_and_bolt:️之前试验contains_characterTestContainsCharacter字符试验is_valid_sizeTestIsValid...
    99+
    2024-04-02
  • Laravel如何自定义验证对象
    这篇文章主要介绍“Laravel如何自定义验证对象”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Laravel如何自定义验证对象”文章能帮助大家解决问题。Laravel 5.5 将提供一个全新的自定...
    99+
    2023-07-04
  • LazyCaptcha如何自定义随机验证码和字体
    这篇文章将为大家详细讲解有关LazyCaptcha如何自定义随机验证码和字体,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。介绍LazyCaptcha是仿EasyCaptcha和SimpleCaptcha,...
    99+
    2023-06-29
  • DreamWeaver CS3中如何实现SPRY的自定义验证
    这篇文章将为大家详细讲解有关DreamWeaver CS3中如何实现SPRY的自定义验证,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。代码如下:<span id="sprytextfiel...
    99+
    2023-06-08
  • python 密码验证(滑块验证)
    目录题目描述:解题思路/算法分析/问题及解决实验代码题目描述: (1)模拟登陆界面,判别用户名和密码,给出合适的提示,如果超过三次,锁定输入。用代替密码;或者最新输入显示,前面的变成...
    99+
    2024-04-02
  • Gin 框架中的自定义验证
    “纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《Gin 框架中的自定义验证》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有...
    99+
    2024-04-05
  • vue中element如何自定义表单验证请求后端接口验证
    小编给大家分享一下vue中element如何自定义表单验证请求后端接口验证,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!做vue...
    99+
    2024-04-02
  • Golang 验证器自定义枚举验证规则
    php小编小新今天给大家介绍一款强大的Golang验证器——自定义枚举验证规则。随着Golang的流行,越来越多的开发者开始使用它来构建高效、可靠的应用程序。而验证器是其中一个重要的工...
    99+
    2024-02-09
  • vue表单验证自定义验证规则详解
    本文实例为大家分享了vue表单验证自定义验证规则,供大家参考,具体内容如下 这是公司里Vue+Element UI的项目。写的验证规则放图: 样式代码: <div class...
    99+
    2024-04-02
  • Android自定义View实现随机数验证码
    目录前言效果自定义 View 分类步骤1.自定义属性2.添加构造方法3.在构造里获取自定义样式4.重写 onDraw 计算坐标绘制5.重写 onMeasure 测量宽高6.设置点击事...
    99+
    2024-04-02
  • python如何实现三次密码验证
    小编给大家分享一下python如何实现三次密码验证,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是用于编写自动化...
    99+
    2023-06-14
  • ORACLE中如何自定义系统验证的错误信息
    这篇文章将为大家详细讲解有关ORACLE中如何自定义系统验证的错误信息,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在ADF应用中,生成的EO都会自动生成部分约束,如必填...
    99+
    2024-04-02
  • go中跨域自定义验证的问题
    在Go语言开发中,跨域请求是一个常见的问题。跨域请求是指在浏览器中,通过JavaScript代码向不同域名下的服务器发送请求。由于浏览器的同源策略限制,跨域请求默认是不被允许的。然而,...
    99+
    2024-02-12
    go语言
  • Android自定义滑动验证条的示例代码
    本文介绍了Android自定义滑动验证条的示例代码,分享给大家,具体如下:*注:不知道为什么,h6的标签在这里没用了,所以我也只能用Markdown的语法来写了项目地址:https://github.com/994866755/handso...
    99+
    2023-05-30
    android 滑动验证条 roi
  • hyperf 自定义验证器的使用
    引入组件包 composer require hyperf/validation 添加中间键 您需要为使用到验证器组件的 Server 在 config/autoload/middlewares.php 配置文件加上一个全局中间件 Hype...
    99+
    2023-09-04
    php java 数据库
  • 如何自定义 PHP 函数参数的类型验证?
    在 php 中自定义函数参数类型验证可强制参数类型,确保其符合预期,从而提高代码健壮性。可通过以下方式实现:类型提示:声明函数参数的预期类型,不匹配类型将抛出异常。类型转换:使用 set...
    99+
    2024-04-10
    php 参数验证
  • vue elementUI如何实现自定义正则规则验证
    这篇文章给大家分享的是有关vue elementUI如何实现自定义正则规则验证的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。项目场景:常见的表单填写中都会遇到,比如新增信息,修改信息等,如下图相信大家对...
    99+
    2023-06-29
  • Spring Boot中整合Spring Security并自定义验证代码实例
    最终效果实现页面访问权限限制 2、用户角色区分,并按照角色区分页面权限 3、实现在数据库中存储用户信息以及角色信息 4、自定义验证代码效果如下: 免验证页面  登陆页面 在用户未登录时,访问任意有权限要求的页面都会自动跳转到登陆页...
    99+
    2023-05-31
    spring security spring boo
  • 自定义 Laravel 表单验证规则 – 通过 API 来验证
    我们所有的人都知道 Laravel 提供了一个非常方便的方式来验证表单,使用表格验证。但是你有没有发现自己需要使用第三方的 API 来验证一个表单字段?我最近在一个项目中就遇到了这个需求。我为一个第三方服务保存了一个 API 密钥,并被要求...
    99+
    2023-08-07
    api 验证表单 Laravel
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作