
1. 项目概述今天要分享一个非常实用的Python小项目——模拟用户登录系统并实现三次错误锁定功能。这个功能在实际应用中非常常见比如银行APP、企业OA系统等都会采用类似的机制来防止暴力破解。作为Python初学者实现这样一个功能不仅能巩固基础语法还能学习到文件操作、流程控制等核心知识点。这个项目的核心逻辑是用户有三次尝试登录的机会如果连续三次输入错误密码系统就会锁定该账号禁止再次尝试登录。锁定状态会持续到管理员手动解除在本例中通过删除黑名单文件实现。下面我会从零开始详细讲解每个实现步骤。2. 核心功能设计2.1 系统流程图整个登录系统的流程可以简化为以下几个关键步骤用户输入用户名系统检查用户名是否在黑名单中如果在黑名单中直接拒绝登录如果不在允许输入密码验证用户名和密码组合验证失败则记录尝试次数达到三次失败后将该用户加入黑名单2.2 数据结构设计我们需要两个核心数据存储正确的用户名和密码示例中硬编码为test/test黑名单用户列表存储在black_user文件中注意实际项目中绝对不要将密码明文存储这里仅为演示用途。生产环境应该使用密码哈希加盐存储。3. 代码实现详解3.1 基础框架搭建首先创建一个Python文件比如命名为login_system.py。我们先导入必要的模块并定义常量# -*- coding: utf-8 -*- MAX_ATTEMPTS 3 # 最大尝试次数 BLACKLIST_FILE black_user.txt # 黑名单文件名 CORRECT_USERNAME test # 正确用户名 CORRECT_PASSWORD test # 正确密码3.2 黑名单检查功能接下来实现检查用户是否在黑名单中的功能def is_user_locked(username): try: with open(BLACKLIST_FILE, r) as f: locked_users f.read().splitlines() return username in locked_users except FileNotFoundError: # 如果黑名单文件不存在视为没有锁定用户 return False这个函数会尝试打开黑名单文件读取所有被锁定的用户名每行一个检查输入的用户名是否在其中如果文件不存在自动创建空列表3.3 主登录逻辑下面是核心的登录验证逻辑def login(): username input(请输入用户名: ) if is_user_locked(username): print(账号已被锁定请联系管理员) return attempts 0 while attempts MAX_ATTEMPTS: password input(请输入密码: ) if username CORRECT_USERNAME and password CORRECT_PASSWORD: print(登录成功) return else: attempts 1 remaining MAX_ATTEMPTS - attempts if remaining 0: print(f用户名或密码错误还剩{remaining}次尝试机会) # 如果执行到这里说明三次都错了 with open(BLACKLIST_FILE, a) as f: f.write(f{username}\n) print(错误次数过多账号已被锁定)3.4 完整代码整合将以上部分组合起来并添加一些友好的交互提示def main(): print( 用户登录系统 ) while True: login() choice input(\n是否继续尝试(y/n): ) if choice.lower() ! y: break if __name__ __main__: main()4. 功能测试与验证4.1 正常登录场景运行程序输入正确的用户名(test)和密码(test)应该看到登录成功的提示4.2 错误密码场景运行程序输入正确的用户名(test)连续三次输入错误密码第三次错误后应该看到锁定提示再次尝试用同一用户名登录时应该直接提示账号锁定4.3 黑名单文件检查程序运行后会在同一目录下生成black_user.txt文件里面记录了被锁定的用户名。可以手动删除这个文件来解除锁定。5. 进阶改进建议5.1 密码隐藏输入当前版本输入密码时会明文显示不安全。可以使用getpass模块改进from getpass import getpass password getpass(请输入密码: )5.2 锁定时间限制当前锁定是永久的可以增加时间限制import time import json # 存储锁定时间和用户名 lock_data { username: test, lock_time: time.time() # 当前时间戳 } # 保存到文件 with open(lock_data.json, w) as f: json.dump(lock_data, f) # 检查是否超过锁定时间 def is_lock_expired(): try: with open(lock_data.json, r) as f: data json.load(f) return time.time() - data[lock_time] 3600 # 1小时 except FileNotFoundError: return True5.3 多用户支持目前只支持一个硬编码用户可以扩展为从文件或数据库读取用户数据# users.json { users: [ { username: test, password: test # 实际应该存储密码哈希 }, { username: admin, password: admin123 } ] }6. 常见问题排查6.1 文件权限问题如果在Linux/Mac上运行可能会遇到文件权限错误。解决方法chmod 644 black_user.txt6.2 中文编码问题如果用户名包含中文确保文件以UTF-8编码保存with open(BLACKLIST_FILE, a, encodingutf-8) as f: f.write(f{username}\n)6.3 跨平台兼容性Windows和Linux的换行符不同可以统一处理locked_users f.read().splitlines() # 自动处理不同换行符7. 项目扩展思路这个基础版本还可以进一步扩展添加密码强度检查实现密码重置功能增加验证码机制记录登录日志添加管理员解锁功能比如实现一个简单的解锁功能def unlock_user(): username input(输入要解锁的用户名: ) if not is_user_locked(username): print(该用户未被锁定) return with open(BLACKLIST_FILE, r) as f: users f.read().splitlines() users.remove(username) with open(BLACKLIST_FILE, w) as f: f.write(\n.join(users)) print(f用户 {username} 已解锁)8. 安全注意事项虽然这只是一个演示项目但有几个重要的安全原则需要注意永远不要明文存储密码 - 应该使用bcrypt等安全哈希算法黑名单文件应该放在非web可访问的目录考虑对登录尝试进行IP限制生产环境应该使用成熟的认证框架如Django的auth系统一个简单的密码哈希示例import bcrypt # 存储密码 password mypassword.encode(utf-8) hashed bcrypt.hashpw(password, bcrypt.gensalt()) # 验证密码 input_password mypassword.encode(utf-8) if bcrypt.checkpw(input_password, hashed): print(密码正确)9. 性能优化建议当用户量很大时当前的文本文件方案可能性能不佳。可以考虑使用SQLite数据库存储用户和黑名单实现缓存机制减少文件IO对频繁访问的数据保持内存缓存简单的SQLite实现示例import sqlite3 def init_db(): conn sqlite3.connect(auth.db) c conn.cursor() c.execute(CREATE TABLE IF NOT EXISTS users (username TEXT PRIMARY KEY, password TEXT)) c.execute(CREATE TABLE IF NOT EXISTS blacklist (username TEXT PRIMARY KEY, lock_time TIMESTAMP)) conn.commit() conn.close()10. 项目部署说明最后如果你想把这个小项目变成一个真正的服务可以考虑使用Flask/Django做成Web服务添加HTTPS支持配置Nginx反向代理实现会话管理一个最简单的Flask示例from flask import Flask, request, jsonify app Flask(__name__) app.route(/login, methods[POST]) def login(): data request.json username data.get(username) password data.get(password) # 这里添加验证逻辑 return jsonify({status: success}) if __name__ __main__: app.run()这个Python登录系统虽然简单但涵盖了很多实际开发中的核心概念。通过不断迭代和完善你可以把它发展成一个功能完备的认证系统。在实际开发中建议直接使用成熟的认证库但理解底层原理对成为更好的开发者至关重要。