4. 多级确认流程

任务目标

设计一个删除数据库的多级确认流程:第一级需要操作者输入数据库名称进行确认;第二级需要管理员输入动态生成的验证码进行二次确认;第三级需要操作者再次输入“DELETE”关键字作为最终确认。三级全部通过后才真正执行删除操作,任何一级失败则终止流程。

核心实现

import secrets
import sys

class MultiLevelConfirm:
    def __init__(self, db_name):
        self.db_name = db_name
        self.admin_code = secrets._hex(3).upper()  # 动态验证码

    def level1_confirm(self):
        """第一级:操作者输入数据库名称"""
        user_input = input(f"请输入要删除的数据库名称({self.db_name})以确认: ").strip()
        if user_input != self.db_name:
            print("❌ 数据库名称不匹配,流程终止。")
            return False
        print("✅ 第一级确认通过")
        return True

    def level2_confirm(self):
        """第二级:管理员输入动态验证码"""
        print(f"管理员验证码: {self.admin_code}")
        admin_input = input("请输入管理员提供的验证码: ").strip().upper()
        if admin_input != self.admin_code:
            print("❌ 验证码错误,流程终止。")
            return False
        print("✅ 第二级确认通过")
        return True

    def level3_confirm(self):
        """第三级:操作者输入DELETE关键字"""
        keyword = input("输入 DELETE 以执行最终确认: ").strip().upper()
        if keyword != "DELETE":
            print("❌ 关键字错误,流程终止。")
            return False
        print("✅ 第三级确认通过")
        return True

    def execute_deletion(self):
        """执行删除操作(模拟)"""
        print(f"⚠️  正在删除数据库: {self.db_name}")
        # 实际场景中此处调用数据库删除API
        return True

    def run(self):
        """按顺序执行三级确认"""
        if not self.level1_confirm():
            return False
        if not self.level2_confirm():
            return False
        if not self.level3_confirm():
            return False
        self.execute_deletion()
        print("🎉 数据库删除成功")
        return True

if __name__ == "__main__":
    # 模拟目标数据库
    target_db = "customer_db"
    confirm = MultiLevelConfirm(target_db)
    success = confirm.run()
    sys.exit(0 if success else 1)

运行与验证

运行方式:

python multi_level_confirm.py

验证路径:程序启动后按提示依次输入。以下为三种典型场景的预期行为:

  • 全部通过:输入 customer_db → 输入程序显示的管理员验证码 → 输入 DELETE,最终输出“数据库删除成功”,退出码为0。
  • 中途失败:任一级输入错误(如数据库名拼错、验证码输错、关键字不是DELETE),立即输出对应错误提示并终止,退出码为1,且不会执行删除操作。
  • 验证码动态性:每次运行程序,第二级要求的管理员验证码均不同(由secrets._hex随机生成),防止重放攻击。

通过判定标准:只有三级确认全部通过时,才出现“正在删除数据库”和“数据库删除成功”的输出;任何一级失败时,输出中不得出现这两条消息。退出码0表示成功,1表示流程被拒绝。

关键设计说明

  • 权限分离:第一、三级面向操作者,第二级面向管理员,通过动态验证码实现双人授权,避免单点误操作。
  • 安全细节:验证码使用secrets模块生成,适合安全敏感场景;输入比较时对验证码和关键字做大小写归一化,但对数据库名称保持精确匹配。
  • 短路终止:任何一级失败立即返回False,后续级别不会执行,符合“全部通过才执行”的要求。