Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无论输入任何用户密码,我的登录系统都无法工作_Python_Authentication - Fatal编程技术网

Python 无论输入任何用户密码,我的登录系统都无法工作

Python 无论输入任何用户密码,我的登录系统都无法工作,python,authentication,Python,Authentication,我的注册和登录身份验证系统无法正常工作。我的注册问题已修复,但我的登录有问题。要么代码允许我通过并访问该帐户,要么不允许,具体取决于代码。但每当我试图修复它时,输出就是两个选项之一。始终,无论我输入的密码是什么 用户名和密码存储在txt文件中,如下所示: John Appleseed:hisSuperSecretPassword JohnDoe:1234 登录代码: found = False username = input("Enter your username:\n"

我的注册和登录身份验证系统无法正常工作。我的注册问题已修复,但我的登录有问题。要么代码允许我通过并访问该帐户,要么不允许,具体取决于代码。但每当我试图修复它时,输出就是两个选项之一。始终,无论我输入的密码是什么

用户名和密码存储在txt文件中,如下所示:

John Appleseed:hisSuperSecretPassword
JohnDoe:1234
登录代码:

found = False
username = input("Enter your username:\n")
file = open("account.txt", "r+")
    
for line in file:
    if line.split(':')[0] == username:
        found = True
if found == True:
    password = input("Enter your password:\n")

    for counter, line in enumerate(file):
            
        if line.strip() == username + ":" + password:
            print("You have signed in.")
        else:
            print("Password incorrect. Program closing.")
            sys.exit()
else:
    print("Username not valid.")
    sys.exit()

有人能帮忙吗?当然是在运行最新的Python。

这里是我为适应工作而做的调整

import sys

found = False
username = input("Enter your username:\n")
file = open("account.txt", "r+")
    
for line in file:
    if line.split(':')[0] == username:
        account_details = line.split(':')
        found = True

if found == True:
    password = input("Enter your password:\n")
    if account_details[1].strip() == password:
        print("You have signed in.")
    else:
        print("Password incorrect. Program closing.")
        sys.exit()
else:
    print("Username not valid.")
    sys.exit()

一旦发现不匹配的密码,您就退出程序,而不是将密码与正确的用户进行比较。您也不需要重新读取整个密码文件:在验证用户名存在时,您已经找到了预期的密码

顺便说一句,对于攻击者来说,确认他们正确猜测了用户名是没有意义的。只需先获取用户名和密码,然后在密码文件中查找它们

username = input("Enter your username:\n")
password = input("Enter your password:\n")

with open("account.txt") as fh:
    if any(f'{username}:{password}' == line.strip() for line in fh):
        print("You have signed in.")
    else:
        print("Invalid username or password, exiting")
        sys.exit()

你还没有表示你已经调试过它,或者如果你已经调试过,你是如何调试的。您是否尝试打印
line.split(“:”)[0]
line.strip()
,以及
username+”:“+password
,以查看它们实际包含的内容?这将是我调试此文件的第一步。在查找用户名匹配项时,您已从文件中读取一行或多行。然后,
enumerate()
读取文件的其余部分,查找包括密码在内的完整匹配项,但不包括您已经读取的实际用户条目。将
file.seek(0)
放在第二个循环之前。或者更好的方法是,从文件中创建一个查找表:
users=dict(line.strip().split(“:”),如果line.strip())
,则为文件中的行创建一个查找表。然后,您可以简单地检查
用户。get(username)=password
。是的,在我将其放入堆栈溢出之前,我已经对其进行了多次调试。第二条评论:我删除了它,然后再试一次,但它会做同样的事情:接受或拒绝我,不管密码是什么。第三条评论:我会尝试一下,但我不完全理解您的代码有两个主要错误:一个是在第一个循环中用完了文件,第二个是当您的程序发现一个错误条目时退出。也许最简单的方法就是删除enumerate(file)中计数器的
行,这样您就使用了与用户名匹配的行。谢谢,这段代码很管用!