公司动态

Python实现基础用户认证:文件存储与登录验证

📅 2026/7/19 2:39:14
Python实现基础用户认证:文件存储与登录验证
1. 项目背景与目标在日常开发中我们经常需要处理用户认证的场景。比如开发一个内部管理系统时最简单的用户认证方式就是通过用户名和密码登录。作为Python初学者如何实现这个基础但重要的功能呢这个练习将带你完成一个完整的流程从文本文件读取账号信息到实现控制台登录验证。我会用最基础的Python语法实现避免引入复杂框架确保零基础也能跟上。通过这个练习你将掌握文件读取的基本操作字符串处理技巧简单的控制流应用基础异常处理提示虽然实际项目中我们会用数据库存储用户信息但文本文件是最轻量级的练习方式适合理解认证流程的本质。2. 准备工作创建测试账号文件2.1 账号文件格式设计我们先创建一个users.txt文本文件存储账号信息每行记录一个用户用户名和密码用冒号分隔admin:123456 user1:qwerty test_user:test123这种格式简单直观冒号作为分隔符比空格更可靠因为密码可能包含空格每行一个账号便于逐行读取无多余字符方便解析2.2 文件存储注意事项将文件保存在你的项目目录下注意不要用中文路径避免编码问题文件名全小写避免系统差异文件权限设置为仅当前用户可读写特别是生产环境在Linux/Mac上可以用chmod 600 users.txt3. 核心代码实现3.1 读取账号文件我们先实现文件读取功能使用with语句确保文件正确关闭def load_accounts(file_path): accounts {} try: with open(file_path, r) as f: for line in f: line line.strip() # 去除首尾空白字符 if line and not line.startswith(#): # 跳过空行和注释 username, password line.split(:, 1) accounts[username] password except FileNotFoundError: print(f错误文件 {file_path} 不存在) except Exception as e: print(f读取文件时出错{e}) return accounts关键点解析strip()去除换行符和空格split(:, 1)只分割第一个冒号防止密码中含冒号使用字典存储方便快速查找用户名3.2 用户输入处理使用input()获取用户输入注意处理空白输入def get_credentials(): while True: username input(用户名: ).strip() if username: break print(用户名不能为空) while True: password input(密码: ).strip() if password: break print(密码不能为空) return username, password3.3 登录验证逻辑def login(accounts): username, password get_credentials() if username in accounts and accounts[username] password: print(f登录成功欢迎{username}) return True else: print(用户名或密码错误) return False4. 完整程序与测试4.1 完整代码def load_accounts(file_path): accounts {} try: with open(file_path, r) as f: for line in f: line line.strip() if line and not line.startswith(#): username, password line.split(:, 1) accounts[username] password except FileNotFoundError: print(f错误文件 {file_path} 不存在) except Exception as e: print(f读取文件时出错{e}) return accounts def get_credentials(): while True: username input(用户名: ).strip() if username: break print(用户名不能为空) while True: password input(密码: ).strip() if password: break print(密码不能为空) return username, password def login(accounts): username, password get_credentials() if username in accounts and accounts[username] password: print(f登录成功欢迎{username}) return True else: print(用户名或密码错误) return False if __name__ __main__: account_file users.txt accounts load_accounts(account_file) if accounts: # 只有成功读取文件才继续 max_attempts 3 attempts 0 while attempts max_attempts: if login(accounts): break attempts 1 print(f剩余尝试次数{max_attempts - attempts}) else: print(尝试次数过多程序退出)4.2 测试用例设计测试时应考虑以下情况正确用户名和密码正确用户名错误密码错误用户名空输入文件不存在的情况文件格式错误的情况5. 安全增强与改进建议5.1 密码安全基础虽然这是练习但了解安全常识很重要实际项目中永远不要明文存储密码应该使用哈希算法如bcrypt存储密码哈希值添加盐值(salt)防止彩虹表攻击5.2 改进方向密码输入隐藏使用getpass模块但注意在部分IDE中可能不工作from getpass import getpass password getpass(密码: )账户锁定机制连续失败后暂时禁止尝试日志记录记录登录尝试便于审计密码强度检查注册时验证密码复杂度6. 常见问题排查6.1 编码问题如果遇到UnicodeDecodeError可能是文件编码问题。可以指定编码方式with open(file_path, r, encodingutf-8) as f:常见编码尝试utf-8gbklatin-16.2 文件权限问题错误信息示例PermissionError: [Errno 13] Permission denied: users.txt解决方案检查文件是否存在检查当前用户是否有读取权限在Linux/Mac上使用ls -l查看权限6.3 格式错误如果文件格式不正确比如某行没有冒号分隔会导致ValueError。可以这样处理try: username, password line.split(:, 1) except ValueError: print(f忽略格式错误的行{line}) continue7. 项目扩展思路掌握了基础版本后可以尝试以下扩展增加注册功能允许添加新用户密码修改功能将用户数据改为JSON格式存储添加简单的权限系统如管理员/普通用户用类(class)重构代码提高可维护性例如JSON格式存储{ admin: { password: 123456, role: admin }, user1: { password: qwerty, role: user } }这个练习虽然简单但涵盖了文件I/O、数据结构、控制流等Python核心概念。建议你在实现基础功能后尝试自己添加一些扩展功能这对提升编程能力很有帮助。