实现 MySQL 密码登录错误次数
流程图
flowchart TD;
A(开始) --> B(输入用户名和密码);
B --> C{验证用户名和密码};
C -- 密码正确 --> D(登录成功);
C -- 密码错误 --> E(记录错误次数);
E --> F{错误次数是否超过限制};
F -- 未超过 --> B;
F -- 超过 --> G(提示用户被锁定);
D --> H(进入系统);
H --> I(结束);
G --> I;
甘特图
gantt
dateFormat YYYY-MM-DD
title 实现 MySQL 密码登录错误次数
section 定义数据表结构
定义用户表结构 :done, des1, 2021-01-01,2021-01-02
定义错误登录记录表结构 :done, des2, 2021-01-01,2021-01-02
section 实现登录验证功能
实现登录验证逻辑 :done, des3, 2021-01-03,2021-01-05
实现记录错误次数逻辑 :done, des4, 2021-01-05,2021-01-07
实现错误次数限制逻辑 :done, des5, 2021-01-07,2021-01-09
实现步骤
定义数据表结构
首先,我们需要定义两个数据表:用户表和错误登录记录表。用户表用于存储用户的用户名和密码,错误登录记录表用于记录用户登录失败的次数。
用户表结构如下:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
password VARCHAR(100) NOT NULL
);
错误登录记录表结构如下:
CREATE TABLE login_attempts (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
attempt_time DATETIME NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id)
);
实现登录验证功能
在用户登录时,我们需要验证用户名和密码是否正确。可以使用以下代码片段实现:
import mysql.connector
def verify_login(username, password):
try:
# 连接数据库
conn = mysql.connector.connect(
host="localhost",
user="root",
password="password",
database="mydatabase"
)
# 创建游标对象
cursor = conn.cursor()
# 查询用户信息
query = "SELECT id, password FROM users WHERE username = %s"
cursor.execute(query, (username,))
user = cursor.fetchone()
if user is None:
print("用户不存在")
return False
else:
user_id, hashed_password = user
# 验证密码
if password == hashed_password:
print("登录成功")
return True
else:
print("密码错误")
return False
except mysql.connector.Error as err:
print(f"数据库错误:{err}")
finally:
# 关闭数据库连接
if conn.is_connected():
cursor.close()
conn.close()
实现记录错误次数逻辑
每当用户登录失败时,我们都需要记录错误登录的时间和用户信息。可以使用以下代码片段实现:
import datetime
def record_login_attempt(user_id):
try:
# 连接数据库
conn = mysql.connector.connect(
host="localhost",
user="root",
password="password",
database="mydatabase"
)
# 创建游标对象
cursor = conn.cursor()
# 记录登录失败时间
now = datetime.datetime.now()
query = "INSERT INTO login_attempts (user_id, attempt_time) VALUES (%s, %s)"
cursor.execute(query, (user_id, now))
# 提交事务
conn.commit()
except mysql.connector.Error as err:
print(f"数据库错误:{err}")
finally:
# 关闭数据库连接
if conn.is_connected():
cursor.close()
conn.close()
实现错误次数限制逻辑
当用户错误登录的次数超过一定限制时,我们需要限制用户继续尝试登录。可以使用以下代码片段实现:
def check_login_attempts(user_id):
try:
# 连接数据库
conn = mysql.connector.connect(
host="localhost",
user="root",
password="password",
database="mydatabase"
)
# 创建游标对象
cursor = conn.cursor()
# 查询错误登录次数
query = "SELECT COUNT(*) FROM login_attempts