• 有参装饰器实现登录用户文件验证和验证失败锁定


    定义有参数装饰器为被装饰函数添加认证的功能:用户信息的来源可以是文件或者ldap,三次验证失败锁定用户。

    def input_msg():
        '''打印用户要输入的信息,
        返回用户名、密码'''
        username = input("username: ")
        password = input("password: ")
        return username, password
    
    def locked(username):
        '''从user_times.db文件中查询用户名,
        判断用户名是否已被锁定,
        锁定返回False,没锁定返回True'''
        flag_l = True
        with open("user_times.db",mode="r",encoding="utf8") as file:
            for i in file:
                if username == i:
                    flag_l = False
            if flag_l:
                return flag_l
            else:
                return flag_l
    
    error_name_dic = [] #存储用户名密码为错误的用户名的列表
    
    def instert(username):
        '''将用户名密码初错误的用户名插入列表,
        并判该用户名在列表中是否大于等于3次,
        大于等于将该用户名追加入user_times.db'''
        error_name_dic.append(username)
        count = 0
        for i in error_name_dic:
            if i == username:
                count += 1
            if count >= 3:
                with open("user_times.db", mode="a", encoding="utf8") as file:
                    file.write("
    ")
                    file.write(username)
    
    
    def login(username, password):
        '''从user.db中判断输入用户名、
        密码是够正确,正确返回True,
        不正确返回False'''
        flag = False
        error_name = ""
        with open("user.db", mode="r", encoding="utf8") as file:
            for i in file:
                i = eval(i)
                if username == i["username"] and password == str(i["password"]):
                    flag = True
                if username == i["username"] and password != str(i["password"]):
                    error_name = username
            if flag:
                return flag, error_name
            else:
                return flag, error_name
    
    def auth_out(auth_type):
        '''带参数的装饰器,返回auth'''
        def auth(func):
            '''@auth 等于 index = auth(index) ,返回warpper'''
            def warpper(*args, **kwargs):
                '''index实现用户认证'''
                if auth_type == "file":
                    while True:
                        username,password = input_msg()
                        flag_l = locked(username)
                        if flag_l:
                            flag, error_name = login(username, password)
                            if flag:
                                func(*args, **kwargs)
                                return func
                            else:
                                instert(error_name)
                                print("login error...")
                        else:
                            print("%s had been locked." % username)
                elif auth_type == "ldap":
                    print("We don't have ldap.")
            return warpper
        return auth
    
    @auth_out(auth_type = "file")
    def index():
        print("Welcome,this is index page.")
    
    index()
    
  • 相关阅读:
    STL--sort源码分析
    进程和线程的区别
    static 关键字 静态成员变量及静态成员函数
    二叉树遍历总结 先序、中序、后续、广度、深度
    C++用new和不用new创建类对象区别
    传输层--TCP和UDP的区别
    传输层的作用
    微信商户/H5支付申请 被拒原因:网站存在不实内容或不安全信息
    Oracle本地网络服务名配置
    存储过程常用技巧
  • 原文地址:https://www.cnblogs.com/sunqim16/p/6691298.html
Copyright © 2020-2023  润新知