基于Python的用户登录和密码强度等级测试|Python小应用
前言
那么这里博主先安利一些干货满满的专栏了!
这两个都是博主在学习Linux操作系统过程中的记录,希望对大家的学习有帮助!
Linux Syshttps://blog.csdn.net/yu_cblog/category_11786077.html?spm=1001.2014.3001.5482这两个是博主学习数据结构的同时,手撕模拟STL标准模版库各种容器的专栏。操作系统Operating Syshttps://blog.csdn.net/yu_cblog/category_12165502.html?spm=1001.2014.3001.5482
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()