使用 SQLite 储存用户数据


一、数据库的必要性

一些个人项目最开始会把用户写死在代码里或存成 txt 文件,这会带来几个问题:

SQLite 是一个轻量级嵌入式数据库,非常适合个人项目和小型系统。

二、数据库的管理

使用 python 脚本可以方便地实现数据库的管理。

1.初始化

import sqlite3
import os
from werkzeug.security import generate_password_hash

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DB_PATH = os.path.join(BASE_DIR, "blog.db")


def get_connection():
    return sqlite3.connect(DB_PATH)


def init_db():
    conn = get_connection()
    cursor = conn.cursor()

    cursor.execute("""
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        username TEXT UNIQUE NOT NULL,
        password TEXT NOT NULL,
        role TEXT NOT NULL DEFAULT 'user',
        is_active INTEGER NOT NULL DEFAULT 1
    );
    """)

    conn.commit()
    conn.close()

2.添加用户(使用密码哈希)

def add_user(username, password, role="user"):
    conn = get_connection()
    cursor = conn.cursor()

    cursor.execute(
        "SELECT id FROM users WHERE username = ?",
        (username,)
    )

    if cursor.fetchone():
        print("用户已存在")
        conn.close()
        return

    hashed = generate_password_hash(password)

    cursor.execute(
        "INSERT INTO users (username, password, role) VALUES (?, ?, ?)",
        (username, hashed, role)
    )

    conn.commit()
    conn.close()

3.登录验证

from werkzeug.security import check_password_hash


def authenticate(username, password):
    conn = get_connection()
    cursor = conn.cursor()

    cursor.execute(
        "SELECT password FROM users WHERE username = ? AND is_active = 1",
        (username,)
    )

    row = cursor.fetchone()
    conn.close()

    if not row:
        return False

    stored_hash = row[0]
    return check_password_hash(stored_hash, password)

4.删除用户(软删除)

def deactivate_user(username):
    conn = get_connection()
    cursor = conn.cursor()

    cursor.execute(
        "UPDATE users SET is_active = 0 WHERE username = ?",
        (username,)
    )

    conn.commit()
    conn.close()

5.修改密码

def update_password(username, new_password):
    conn = get_connection()
    cursor = conn.cursor()

    hashed = generate_password_hash(new_password)

    cursor.execute(
        "UPDATE users SET password = ? WHERE username = ?",
        (hashed, username)
    )

    conn.commit()
    conn.close()

6.运行的脚本

def main():
    init_db()

    while True:
        print("\n1. 添加用户")
        print("2. 删除用户")
        print("3. 修改密码")
        print("4. 退出")

        choice = input("选择操作:").strip()

        if choice == "1":
            u = input("用户名:")
            p = input("密码:")
            add_user(u, p)

        elif choice == "2":
            u = input("用户名:")
            deactivate_user(u)

        elif choice == "3":
            u = input("用户名:")
            p = input("新密码:")
            update_password(u, p)

        elif choice == "4":
            break


if __name__ == "__main__":
    main()

三、关于哈希

哈希(Hashing)是一种将任意长度的数据转换为固定长度输出的单向函数,这个输出值被称为哈希值(Hash Value)或哈希摘要(Hash Digest)。

在密码存储中,哈希函数用于将用户设置的密码转换为哈希值存储在数据库中。当用户登录输入密码时,系统会对输入的密码进行相同的哈希计算,然后将计算得到的哈希值与数据库中存储的哈希值进行比对,如果两者一致,则说明密码正确。

← 返回首页