Python Tkinter+SQLite登录功能允许错误密码登录的问题咨询
Python Tkinter+SQLite登录功能允许错误密码登录的问题咨询
看起来你的登录功能逻辑有几个关键问题,导致它无法正确验证用户名和密码的匹配性,甚至出现了逻辑颠倒的情况,所以才会不管输入对错都让你登录。咱们一步步来梳理并修复这些问题:
1. 登录验证逻辑完全颠倒
看你login函数里的判断代码,逻辑完全搞反了:
if user_found == True and pass_found== True: messagebox.showinfo(title="login Message",message="Login Failed, Incorect Username or Password") else: webbrowser.open_new(r"C:\Users\lukec\Desktop\Comp NEA\Main Menu MK3.py")
当用户名和密码都验证通过时,你居然提示登录失败;反而验证不通过的时候,直接打开了主菜单。这直接导致了错误的登录行为,应该改成:
if user_found == True and pass_found == True: messagebox.showinfo(title="login Message",message="Login Successful!") webbrowser.open_new(r"C:\Users\lukec\Desktop\Comp NEA\Main Menu MK3.py") else: messagebox.showinfo(title="login Message",message="Login Failed, Incorrect Username or Password")
2. 用户名和密码的验证逻辑错误:未验证「同一用户」的密码匹配
你现在的逻辑是分别查询数据库里是否存在这个用户名和是否存在这个密码,但这两个查询是独立的——比如数据库里有用户Alice密码123,用户Bob密码456,你输入Alice和456,当前逻辑会错误判定为登录成功,因为用户名和密码在数据库里都存在,但不属于同一个用户。
正确的做法是:根据输入的用户名,查询该用户名对应的密码,再和输入的密码做对比。修改后的login函数应该是这样:
def login(root, Usernametxt, Passwordtxt): conn = sqlite3.connect(r"C:\Users\lukec\Desktop\Comp NEA\Data base for project.db") cur = conn.cursor() # 根据用户名查询对应的密码 cur.execute("SELECT Password FROM Users WHERE Username = ?", (Usernametxt.get(),)) result = cur.fetchone() # 无匹配用户时返回None if result is not None: # 对比查询到的密码和输入的密码 if result[0] == Passwordtxt.get(): messagebox.showinfo(title="login Message", message="Login Successful!") webbrowser.open_new(r"C:\Users\lukec\Desktop\Comp NEA\Main Menu MK3.py") else: messagebox.showinfo(title="login Message", message="Login Failed, Incorrect Password") else: messagebox.showinfo(title="login Message", message="Login Failed, Username does not exist") conn.close() Usernametxt.delete(0, END) Passwordtxt.delete(0, END)
3. 登录按钮的参数传递错误
你的登录按钮定义是:
login_btn = Button(root,text="Login",command=login)
但login函数需要接收三个参数,直接写command=login会导致点击按钮时无法传递参数,函数调用报错。应该用lambda来传递参数:
login_btn = Button(root,text="Login",command=lambda: login(root, Usernametxt, Passwordtxt))
额外提一下search函数的问题
虽然你说除了login其他功能正常,但search函数里也有两个明显错误:
cur.execute的参数用了Usernametxt(Entry对象),应该用Usernametxt.get()获取输入的文本cur.execute返回的是游标对象,不是查询结果,需要用fetchone()/fetchall()获取结果后再判断
修正后的search函数示例:
def search(): conn = sqlite3.connect(r"C:\Users\lukec\Desktop\Comp NEA\Data base for project.db") cur = conn.cursor() input_username = Usernametxt.get() input_password = Passwordtxt.get() # 查询用户名是否存在 cur.execute("SELECT * FROM Users WHERE Username = ?", (input_username,)) user_found = cur.fetchone() is not None # 查询密码是否存在(单独查询意义不大,建议和用户名关联验证) cur.execute("SELECT * FROM Users WHERE Password = ?", (input_password,)) pass_found = cur.fetchone() is not None conn.close() # 后续可根据user_found和pass_found做处理
备注:内容来源于stack exchange,提问作者Luke Colligan




