Python+MySQL登录权限校验问题:如何读取access_level并判断权限
解决登录权限校验的问题
首先你的SQL查询语句和逻辑存在几个问题,直接给你修正后的代码并说明关键点:
def check_data(): mail_check = mail_entry.get() pass_check = pass_entry.get() # 优先判断输入是否为空,避免无效数据库查询 if mail_check == "E-mail" or pass_check == "Password": messagebox.showerror("Error", "Fields are not filled") return # 修正SQL:通过邮箱和密码匹配用户,只查询需要的access_level字段 sql = "SELECT access_level FROM employees WHERE email_address = %s AND password = %s" # 仅传入邮箱、密码两个查询参数 my_cursor.execute(sql, (mail_check, pass_check)) # 用fetchone()获取单条结果(邮箱应唯一,无需fetchall()) result = my_cursor.fetchone() if result: # 从查询结果中提取权限值(fetchone()返回元组,索引0对应查询的第一个字段) access_level = result[0] if access_level == 1: logged() elif access_level == 2: logged_2() else: # 无匹配用户,登录失败 failed()
关键修改说明:
- SQL语句修正:WHERE多条件用
AND连接,而非逗号;不需要在WHERE中指定access_level,我们是通过邮箱密码找到用户后读取该字段的值 - 参数简化:仅传入邮箱和密码两个参数,不需要提前给
access_level传值 - 逻辑优化:先检查输入是否为空,减少不必要的数据库交互;用
fetchone()替代fetchall(),因为用户邮箱应唯一,单条结果更高效 - 权限值读取:直接从查询结果的元组中提取
access_level,再进行判断
额外建议:
- 绝对不要明文存储密码!建议用
bcrypt或passlib库对密码做哈希处理,存储哈希值而非原始密码,验证时对输入密码哈希后再比对 - 可以改用字典游标(
my_cursor = mydb.cursor(dictionary=True)),这样能通过字段名取值(result['access_level']),代码可读性更高
内容的提问来源于stack exchange,提问作者Vitaliy
相关产品推荐
相关产品推荐

