You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

关键修改说明:

  1. SQL语句修正:WHERE多条件用AND连接,而非逗号;不需要在WHERE中指定access_level,我们是通过邮箱密码找到用户后读取该字段的值
  2. 参数简化:仅传入邮箱和密码两个参数,不需要提前给access_level传值
  3. 逻辑优化:先检查输入是否为空,减少不必要的数据库交互;用fetchone()替代fetchall(),因为用户邮箱应唯一,单条结果更高效
  4. 权限值读取:直接从查询结果的元组中提取access_level,再进行判断

额外建议:

  • 绝对不要明文存储密码!建议用bcrypt或passlib库对密码做哈希处理,存储哈希值而非原始密码,验证时对输入密码哈希后再比对
  • 可以改用字典游标(my_cursor = mydb.cursor(dictionary=True)),这样能通过字段名取值(result['access_level']),代码可读性更高

内容的提问来源于stack exchange,提问作者Vitaliy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 05:50:37