基于Python的用户登录和密码强度等级测试|Python小应用

news2024/11/25 11:02:09

前言

那么这里博主先安利一些干货满满的专栏了!

这两个都是博主在学习Linux操作系统过程中的记录,希望对大家的学习有帮助!

操作系统Operating Syshttps://blog.csdn.net/yu_cblog/category_12165502.html?spm=1001.2014.3001.5482Linux Syshttps://blog.csdn.net/yu_cblog/category_11786077.html?spm=1001.2014.3001.5482这两个是博主学习数据结构的同时,手撕模拟STL标准模版库各种容器的专栏。

STL源码剖析https://blog.csdn.net/yu_cblog/category_11983210.html?spm=1001.2014.3001.5482手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html


题目要求

  • 设计用户交互界面,进行账户(登录需要用户名及密码,信息包括姓名、学号和密码评分)的输入和储存,并对于用户输入的密码进行评分。
  • 要求至少实现三名用户的信息保存,需通过测试,验证保存账户的有效性,允许用户进行密码修改;
  • 在输入正确的账户信息后,打印账户中保存的信息。

密码按如下规则进行计分(累计),规则如下:

一、密码长度:

  • 5 分: 小于等于4 个字符
  • 10 分: 5 到7 字符
  • 25 分: 大于等于8 个字符

二、字母:

  • 0 分: 没有字母
  • 10 分: 全都是小(大)写字母
  • 20 分: 大小写混合字母

三、数字:

  • 0 分: 没有数字
  • 10 分: 1 个数字
  • 20 分: 大于1 个数字

四、符号:

  • 0 分: 没有符号
  • 10 分: 1 个符号
  • 25 分: 大于1 个符号

五、奖励:

  • 2 分: 字母和数字
  • 3 分: 字母、数字和符号
  • 5 分: 大小写字母、数字和符号

在获得一个密码后,根据如下的评分规则:

  • >= 90: 非常安全
  • >= 80: 安全
  • >= 70: 非常强
  • >= 60: 强
  • >= 50: 一般
  • >= 25: 弱 
  • >= 0: 非常弱

并输出最终的评估结果 密码等级样例:

  • 38$@NoNoNo 期望输出:您的密码属于非常安全等级
  • 123 期望输出:您的密码属于弱等级

注意在实现中验证所有功能,请在报告中包含运行截图、涉及的代码,以及自己对于该问题的理解。注意使用模块化设计,并在关键位置添加注释。

摘要

通过实现Account_System类和User_Information类实现该账号管理系统

账户管理系统功能简介:

题目要求的功能:

  • 通过实现User_Information对每个用户的信息进行存储,并包含了密码等级评定功能,用户可以根据系统提示的密码评级选择是否重新设置密码。

  • 通过过实现Account_System对所有用户的信息进行统一管理,并对外提供用户操作接口

额外实现的功能:

  • Account_System类提供用户操作接口,用户可以通过目录选择对账户信息的增、删、查和改的功能

代码

# 没必要用继承,这里也不应该用继承

from ast import main
from curses.ascii import isdigit, islower, isupper
import pandas as pd
import sys

# =================================== 个人信息类 =================================== #
# ================================ User_Information =============================== #


class User_Information:
    def __init__(self) -> None:
        self.__Password_Rating_list = ['very_secure', 'secure', 'very_strong',
                                       'strong', 'general', 'weak', 'very_weak']  # 类里面访问足够了 - 设为私有属性
        self.user_name = None
        self.pass_word = None
        self.name = None
        self.Student_ID = 0
        self.Password_Rating = None

    def __Get_security_level(self, string='') -> str:  # 类里面访问足够了 - 设为私有方法
        score = 0
        length = len(string)
        digit_cnt = 0  # 数字个数
        upper_cnt = 0  # 大写字母个数
        lower_cnt = 0  # 小写字母个数
        sym_cnt = 0  # 符号的个数
        # 遍历字符串
        for i in range(0, len(string)):
            if string[i].isdigit():
                digit_cnt += 1
            elif string[i].isupper():
                upper_cnt += 1
            elif string[i].islower():
                lower_cnt += 1
        sym_cnt = length-digit_cnt-upper_cnt-lower_cnt
        # 计算得分
        # 密码长度
        if length <= 4:
            score += 5
        elif length <= 7 and length >= 5:
            score += 10
        elif length >= 8:
            score += 25
        # 字母
        if upper_cnt == 0 and lower_cnt == 0:
            score += 0  # 没有字母
        elif (upper_cnt and lower_cnt == 0) or (upper_cnt == 0 and lower_cnt):
            score += 10  # 全都是小(大)写字母
        elif upper_cnt and lower_cnt:
            score += 20  # 大小写混合字母
        # 数字
        if digit_cnt == 0:
            score += 0
        elif digit_cnt == 1:
            score += 10
        elif digit_cnt > 1:
            score += 20
        # 符号
        if sym_cnt == 0:
            score += 0
        elif sym_cnt == 1:
            score += 10
        elif sym_cnt > 1:
            score += 25
        # 额外加分
        if sym_cnt == 0 and upper_cnt and lower_cnt and digit_cnt:
            score += 2
        elif ((sym_cnt and upper_cnt == 0 and lower_cnt and digit_cnt) or
              (sym_cnt and upper_cnt and lower_cnt == 0 and digit_cnt)):
            score += 3
        else:
            score += 5
        # 计算等级
        if score >= 90:
            return self.__Password_Rating_list[0]
        elif score >= 80:
            return self.__Password_Rating_list[1]
        elif score >= 70:
            return self.__Password_Rating_list[2]
        elif score >= 60:
            return self.__Password_Rating_list[3]
        elif score >= 50:
            return self.__Password_Rating_list[4]
        elif score >= 25:
            return self.__Password_Rating_list[5]
        elif score >= 0:
            return self.__Password_Rating_list[6]

    def __set_pass_word(self) -> tuple:  # 类里面访问足够了 - 设为私有方法
        '''密码设置'''
        pass_word = None
        while True:
            pass_word = input("请设置密码:>")
            level = self.__Get_security_level(pass_word)
            print(f"当前的密码等级为: {level} ,如果不需要重新输入请按q退出!")
            choose = input()
            if choose == 'q':
                break
        return pass_word, level

    def set_user_info(self):
        '''设置用户人信息'''
        self.name = input("请输入用户人姓名:>")
        self.Student_ID = input("请输入学号:>")
        self.user_name = input("请设置账户用户名:>")
        self.pass_word, self.Password_Rating = self.__set_pass_word()

    def modify_pass_word(self):
        '''修改密码'''
        print("请修改")
        self.pass_word, self.Password_Rating = self.__set_pass_word()
        print("修改成功!")

# =================================== 账户管理系统类 =================================== #
# =================================== Account_System ================================== #


class Account_System:
    def __init__(self) -> None:
        self.account_list = []

    def add_person_info(self):
        person = User_Information()
        print("============== 添加信息 ==============")
        person.set_user_info()  # 设置该对象信息
        self.account_list.append(person)
        print("============== 添加成功 ==============")
        print()
    def delete_person_info(self):
        user_name=input("请输入要删除的用户名:>")
        for i in range(0,len(self.account_list)):
            if self.account_list[i].user_name == user_name:
                self.account_list.pop(i)
                print("删除成功!")
                return
        print("找不到该账户信息!")

    def search_person_info(self):
        user_name=input("请输入要查找的用户名:>")
        for i in range(0,len(self.account_list)):
            if self.account_list[i].user_name == user_name:
                tmp = self.__to_dict(self.account_list[i])
                print()
                s = pd.Series(tmp)
                print(s)
                print()
                return
        print("找不到该账户信息!")
            
    def modify_person_password(self):
        user_name=input("请输入要修改密码的用户名:>")
        for i in range(0,len(self.account_list)):
            if self.account_list[i].user_name == user_name:
                self.account_list[i].modify_pass_word()
                return
        print("找不到该账户信息!")

    def print_sys_info(self):
        print("============= 当前账户信息 =============")
        print(f"当前账户人数为:{len(self.account_list)}人")
        info_dict_list = []
        for i in range(0, len(self.account_list)):
            tmp = self.__to_dict(self.account_list[i])
            info_dict_list.append(tmp)
        # 最后用Dataframe打印比较好
        print()
        df = pd.DataFrame(info_dict_list)
        df.index=df.index+1

        # 解决打印不对齐问题
        pd.set_option('display.unicode.ambiguous_as_wide', True)
        pd.set_option('display.unicode.east_asian_width', True)
        pd.set_option('display.width', 180) # 设置打印宽度(**重要**)

        print(df) # 打印DataFrame
        print()

    def __to_dict(self, user: User_Information) -> dict:
        ans = {}
        ans['用户名'] = user.user_name
        ans['密码等级'] = user.Password_Rating
        ans['姓名'] = user.name
        ans['学号'] = user.Student_ID
        return ans
    
    def menu(self):
        print("==== 学生账户管理系统 ====")
        print("*       1.添加用户       *")
        print("*       2.删除用户       *")
        print("*       3.查找用户       *")
        print("*       4.修改密码       *")
        print("*       5.打印信息       *")
        print("*       0.退出系统       *")
        print("==== 学生账户管理系统 ====")
        input_ch = int(input("请选择:>"))
        return input_ch

    def start_account_sys(self):
        input_ch = self.menu()
        while input_ch:
            if input_ch==1:
                self.add_person_info()
            elif input_ch==2:
                self.delete_person_info()
            elif input_ch==3:
                self.search_person_info()
            elif input_ch==4:
                self.modify_person_password()
            elif input_ch==5:
                self.print_sys_info()
            elif input_ch==0:
                sys.exit()
            else:
                print("err,请重新选择")
            input_ch = self.menu()



# ======================================= 测试 ======================================= #

def main() -> None:
    stu_sys = Account_System()
    stu_sys.start_account_sys()



if __name__=='__main__':
    main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/774823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Micro-app vue3+vite+ts用法

前言&#xff1a; 微前端的概念是由ThoughtWorks在2016年提出的&#xff0c;它借鉴了微服务的架构理念&#xff0c;核心在于将一个庞大的前端应用拆分成多个独立灵活的小型应用&#xff0c;每个应用都可以独立开发、独立运行、独立部署&#xff0c;再将这些小型应用融合为一个…

文库小程序在线阅读下载文档模板流量主小程序

一、什么是文库小程序&#xff1f; 文库小程序连接流量主&#xff0c;具体流程是粉丝进入小程序下载文档模板&#xff0c;下载前需要看广告&#xff0c;阅读后可以免费下载文档模板。具体的小程序演示请参见抖音云云文库 二、文库小程序的应用范围 小程序主要实现文档共享功能…

Redis Linux安装

Redis版本下载,版本地址http://download.redis.io/releases/ 点击跳转 新建文件夹 mkdir /usr/local/redis 上传压缩包,并使用命令解压tar -zxvf redis-6.2.8.tar.gz (redis-6.2.8.tar.gz为安装包) 安装依赖 yum install gcc-c 编译 make 安装 make install 修改配置 …

概率论和随机过程的学习和整理20:条件概率我知道,但什么是条件期望?可用来解决递归问题

目录 1 目标问题&#xff1a; 什么是条件期望&#xff1f; 条件期望有什么用&#xff1f; 2 条件期望&#xff0c;全期望公式 3 条件期望&#xff0c;全期望公式 和 条件概率&#xff0c;全概率公式的区别和联系 3.1 公式如下 3.2 区别和联系 3.3 概率和随机过程 4 有什…

Zabbix“专家坐诊”第200期问答汇总

问题一 Q&#xff1a;想请问下大佬们&#xff0c;我们zabbix最近有误告警的情况&#xff0c;这个怎么排查呢&#xff1f; 用了proxy&#xff0c;我看了proxy和server的日志&#xff0c;除了有慢查的日志&#xff0c;其它没有异常日志输出。 A&#xff1a;看下这个unreachable的…

首次与电商平台战略签约 第一三共与阿里健康达成战略合作

7月18日&#xff0c;阿里健康与第一三共在杭州正式签署战略合作协议。双方宣布将在此前合作基础上&#xff0c;全面深化心脑血管、风湿骨外科等疾病领域的合作深度&#xff0c;探索以患者为中心、以数字化为驱动力的创新型医药健康服务模式。据悉&#xff0c;此次合作是第一三共…

椒图--分析中心和后台管理中心

护网的时候我们要把右边的开关开启。开启就会对系统全量的记录&#xff0c;包含有网络行为日志&#xff0c;就会检测我们服务器里面的链接&#xff0c;端口箭头&#xff0c;内内网暴露的链接&#xff1b;进程操作日志&#xff0c;就可以看我们系统创建了哪些进程&#xff0c;就…

融云出海:不止假发出口和四卡四待手机,「非洲市场」的参差与机遇

↑ 点击预约“融云北极星”直播↑ 点击预约“实时社区”直播 比白皮书更精炼省流&#xff0c;比图谱更实用有效。 融云《社交泛娱乐出海作战地图》&#xff0c;被多位大咖标记为出海人必备工作手册。针对地图的核心模块&#xff0c;我们推出了系列解读文章&#xff0c;更详尽…

Redis数据持久化的两种方式

说明&#xff1a;Redis数据是存储在内存中的&#xff0c;Redis服务被关闭&#xff0c;数据是会被清除的。但Redis有数据持久化机制&#xff0c;在默认情况下&#xff0c;停止Redis服务会触发数据持久化机制&#xff0c;将数据保存下来&#xff0c;在下次启动时再读取出来。 Re…

解决spring security No AuthenticationProvider found for com.问题

No AuthenticationProvider found for com.xxx.xx 原因 当你验证过&#xff0c;后记得这个这里返回true。不然&#xff0c;就会出现既没有异常&#xff0c;又没验证返回通过的中间尴尬状态&#xff0c;security会当做没有验证通过来处理。 修改

HCIA-存储虚拟化

1、虚拟化概述 KVM是所有云平台的底座&#xff0c;虚拟化是所有云的基础&#xff0c;虚拟化只提供基础架构&#xff0c;云可以提供服务。 CNA是个定制的欧拉系统EulerOS&#xff0c;基于centos内核只保留和虚拟化相关的代码&#xff0c;CNA默认已经部署好kvm虚拟化的软件。CNA…

Visutal Studio2022 如何使用Github copilot

visual studio 2019 升级最新版本的2019也并没有搜索到&#xff0c;直接升级到visual studio 2022&#xff0c;看发布介绍也是2022的copilot Copilot 是一款由 OpenAI 开发的基于 GPT 模型的代码生成工具&#xff0c;可帮助开发者更快地编写代码。如果想在 Visual Studio 中使…

基于大模型的属性操作生成高效训练数据

概述 这篇论文的研究背景是关于利用大型语言模型(LLM)生成高效训练数据的方法。 以往的方法通常是通过LLM生成新的数据&#xff0c;但缺乏对生成数据的控制&#xff0c;这导致了生成数据的信息不足以反映任务要求。本文提出了一种基于LLM的属性操作生成方法&#xff0c;通过精…

如何应对客户报价要求过低的情况?这些方案帮你化解危机!

有个客户在寄样品之前让报价&#xff0c;并且要求承诺价格必须低于15美金&#xff0c;业务员同意了&#xff0c;让客户把样板安排寄到中国&#xff0c;但是收到样品后发现客户的样品在侧面还有一块突出的部分&#xff0c;所以15美金太低了&#xff0c;无论如何也得18美金&#…

计组4——总线Plus IO

(CPU外部的)总线 用于连接computer3大模块(MC/GPUIO) CPU内部的片内总线判优由时序逻辑实现 composition& priority-judging 通信方式 CPU内部的片内总线用于取指、译码、执行、中断的数据通信&#xff1b; IO 总线分为控制线、数据线和地址线&#xff0c;对IO设备的…

Error:Invalid or corrupt jarfile xxx.jar

现象 上传jar包&#xff0c;执行报错&#xff1a;Error&#xff1a;Invalid or corrupt jarfile xxx.jar 解决办法 本地正常执行&#xff0c;上传服务器执行报错。排查发现是因为文件不完整导致&#xff0c;重新上传&#xff0c;比对文件大小&#xff0c;一致后重新执行成功&…

如何在电子设备行业运用IPD?

电子设备是指由集成电路、晶体管、电子管等电子元器件组成&#xff0c;应用电子技术(包括)软件发挥作用的设备&#xff0c;包括电子计算机以及由电子计算机控制的机器人、数控或程控系统等。电子设备基本解释为由微电子器件组成的电器设备。固定资产分类中的电子设备&#xff0…

【重温篇】八大排序——归并排序

思路 归并排序是一种经典的排序算法&#xff0c;采用分治法的思想。它将待排序的数组分成两个较小的子数组&#xff0c;分别对这两个子数组进行排序&#xff0c;然后将排好序的子数组合并成一个有序的数组。 归并排序的主要思路如下&#xff1a; 分解&#xff1a;将待排序的数…

JMETERbeanshell多种姿势获取目标值

beanshell通过vars方式取值 JMETER三种取值方法步骤_securitor的博客-CSDN博客 beanshell通过props方式取值 JMETER取值二_securitor的博客-CSDN博客 beanshell通过source方式取值 JMETER取值三_securitor的博客-CSDN博客 beanshell通过jar包方式取值 JMETER取值四_securitor的…

PHP客服系统-PhpWorkmanChat客服系统修改管理员密码

作为一款流行的开源PHP客服系统&#xff0c;基于thinkphp和workman&#xff0c;跨平台轻量级客服系统源码 管理员表是v2_admin 账户是admin&#xff0c;如果密码忘记了怎么办。可以直接修改数据库表v2_admin &#xff0c;密码规则是md5(密码 加密盐) &#xff0c; 加密盐可以在…