1、参考模型,这个作业我参考了linux的登录认证流程以及结合网上银行支付宝等锁定规则;
1)认证流程参考的是Linux的登录:当你输入完用户名密码后再验证用户名是否存在用户是否被锁定,然后在验证密码是否正确,如果验证不过去只会告诉你验证失败,而不告诉你到底是用户名错误还是密码错误,增加了暴力破解的难度;
2)关于输入错误次数的计数和锁定,我参考的是银行和支付宝的做法,也就是只关心你输错了多少次,不关心输对了多少次,也就是说输错了两次,第三次输对了,前面的计数不清零,也就是你今天输入了1000次输对了997次,只输错了3次,那对不起,依然要锁定。而且输入错误的3次不一定要连续。只要三次输入错误三次就锁定。
2、关于计数和状态的保存我考虑还是通过文件来持久化保存,每次输入错误次数的累加和锁定都保存到文件中,这样虽然增加了文件的操作,但是保证了程序的可靠性,这样程序退出,计数依然有效。文件类型如下:
alex sb lock 3
tom 666 unlock 0
geng 888 unlock 2
其中第一列是用户名,第二列是密码,第三列是用户状态(lock代表锁定,unlock代表没有锁定),第四列是登录次数(其实,登录次数只要错误的时候登录次数加一即可,没有错误的时候不用管它)。
代码如下:
with open(filename,) key,values lines = print( f.write( .join(lines) + values.insert( f.write( .join(values) + # messages = {:[,,],:[,,],:[,, # write_file(messages, __name__ == active = username = input( users_dict = {} #用户字典,用于存放用户的信息,键-用户名,值- with open(,) lines = line user_list = users_dict[user_list[]] = user_list[ username users_dict[username][] == print( (users_dict[username][]) < user_pwd = input( users_dict[username][] == print( (users_dict[username][]) != print( % ( - (users_dict[username][ users_dict[username][] = (users_dict[username][]) + print( users_dict[username][] = users_dict[username][] = write_file(users_dict, elif username == print() 运行结果如下: 请输入你的用户名(输入quit退出):tom 请输入密码:22 还有2次机会,用户将被锁定! 请输入密码:22 还有1次机会,用户将被锁定! 请输入密码:22 对不起,您输入的次数过多,你的用户名已经被锁定,请联系管理员! 请输入你的用户名(输入quit退出):alex 您输入的用户名已经锁定,请联系管理员!
其实对文件的操作,其本质上还是对字符串列表,字典的操作,文件的操作,读取文件的方法,readlines()按行读取存放到一个列表中,使用dict(字典)记录用户信息。字符串的拼接(join)方法,(" ".join(list)),字符串与列表进行拼接,形成一个新的字符串,其实字符串的本质上在python中存储的形式就是以列表的形式存储,列表之间的拼接,list.extend(list),列表之间的拼接。
代码说明:
1、这里用了两个今天课程没有讲的内容:字典和函数,将用户信息以字典的方式保存是出于判断用户名是否存在的考虑,读文件的时候直接将用户名作为字典的一个key,其他的信息作为字典的value与key一一对应,这样在判断用户名是否存在只需要通过in这个成员运算符进行判断就可以了;
2、代码的第61和62两行代码完成的就是将文件变成字典的过程。
原创张晓宇代码实例:
#!/usr/bin/env python3 # coding:utf-8'''Created on: 2015年12月29日 @author: 张晓宇 Email: 61411916@qq.com Version: 1.0Description: 输入用户名密码,认证成功显示欢迎信息,认证失败,输错三次后锁定 Help:'''import os # 定义用户信息写入函数,用于把用户信息写回文件 def write_to_account_file(accounts,account_file_path):"""accounts是一个用户信息字典,目的是把变更过的信息写入文件中"""account_file = open(account_file_path,"w")for key,val in accounts.items(): line = [] line.append(key) line.extend(val) print(" ".join(line)) #字符串与列表拼接,目的是实现列表中每个元素加空格生成一个字符串如a b c d格式 account_file.write(" ".join(line) + " ") #往文件中添加信息 account_file.close() #直接打开文件的时候一定要记得关闭文件,以免文件休息丢失if __name__ == '__main__':''' @parameters: account_file_path:账户文件 password_col_num:账户文件中密码所在的列(从0开始) status_col_num:账户文件中账户状态所在的列(从0开始) error_count_num:账户文件中输入错误次数所在的列(从0开始) app_info:系统信息,用户启动应用后的
上面代码中亮点:
(1)continue:结束本次循环,continue后面的代码都不执行,达到重新让用户输入的目的,很多网页都是让用户一直输入,知道用户要么选择注册,要么关掉网页;
(2)文档的规范性比较好,有解释;
(3)文件就是一行一行读,然后一行一行写入文件,修改的过程中要用到列表和字典的知识;
(4)" ".join(list)字符串与列表的拼接,生成新的字符串;
(5)split()字符串的分割;extend()列表之间的拼接。
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com