如何利用Python中SQLite查询返回的results变量验证用户权限,实现仅管理员可添加商品的功能
实现权限校验的解决方案
当然可以!你的思路完全可行,咱们直接利用results变量就能完成权限判断。先帮你理清楚results的结构:fetchall()会返回一个元组列表——如果用户名和密码匹配,列表里会有一个元组(对应Users表中该用户的整行数据);如果不匹配,列表就是空的。
接下来分两步实现权限校验:
1. 基础实现(基于索引定位字段)
假设你的Users表字段顺序是:ID, Username, Password, userPermissionLevel(如果你的字段顺序不同,调整索引即可),可以这样写判断逻辑:
existingAccount = input("Do you already have an account? (y/n)") if existingAccount == "y": username = input("Please enter your username: ") password = input("Please enter your password:") find_user = ("SELECT * FROM Users WHERE Username = ? AND Password = ?") c.execute(find_user, (username, password)) results = c.fetchall() # 先判断用户是否登录成功(即账号密码匹配) if results: # 从结果中提取权限等级:results[0]是唯一的用户元组,索引3对应userPermissionLevel字段 user_permission = results[0][3] # 校验权限(用lower()避免大小写敏感问题) if user_permission.strip().lower() == "admin": # 执行添加新商品的函数 add_new_product() else: print("permission level inadequate") else: print("Invalid username or password")
2. 更健壮的实现(基于字段名定位)
如果担心后续表结构调整(比如字段顺序变化)导致索引失效,建议改用字典游标,这样可以直接通过字段名获取权限值,可读性和维护性更好:
# 初始化连接时指定字典游标 conn = sqlite3.connect('your_database.db') c = conn.cursor(cursor_factory=sqlite3.Row) # 使用字典游标 existingAccount = input("Do you already have an account? (y/n)") if existingAccount == "y": username = input("Please enter your username: ") password = input("Please enter your password:") find_user = ("SELECT * FROM Users WHERE Username = ? AND Password = ?") c.execute(find_user, (username, password)) result = c.fetchone() # 因为账号密码唯一,用fetchone()比fetchall()更高效 if result: # 直接通过字段名获取权限等级 user_permission = result["userPermissionLevel"] if user_permission.strip().lower() == "admin": add_new_product() else: print("permission level inadequate") else: print("Invalid username or password")
额外提示
- 用
fetchone()替代fetchall():因为用户名+密码的组合是唯一的,不可能返回多行结果,fetchone()更高效,代码也更简洁。 - 大小写处理:用
lower()把权限值转为小写再判断,避免因为存储的是Admin/ADMIN导致校验失败。 - 空格处理:
strip()可以去掉权限值前后的空格,避免数据库中存储的权限值带空格导致判断错误。
内容的提问来源于stack exchange,提问作者SourOddity
相关产品推荐
相关产品推荐

