用户类型判定逻辑错误:输入正确账号密码仍提示验证失败
问题分析与修复
核心错误点
- 条件判断逻辑完全颠倒:
Auth构造函数中使用if (!users.ContainsKey(login)),意思是「当登录名不存在于用户字典时」才进入验证分支,这和实际需求完全相反——我们需要在登录名存在时才验证密码。 - 密码验证逻辑错误:
users[password] == users[login]是把输入的密码当作字典的键去取值,再和登录名对应的密码对比,这完全不符合验证逻辑,正确的应该是拿登录名对应的密码和输入的密码比较:users[login] == password。 - 用户类型判定逻辑错误:
users[login] == "admin"是在判断登录名对应的密码是否等于"admin",但实际我们需要判断的是登录名本身是不是"admin"或"user"。 - 分支逻辑错误:原代码中当登录名存在时,直接进入else分支把
userType设为None,这会导致所有合法登录名都被判定为无效。
修复后的Auth类构造函数
public Auth(string login, string password) { users = new Dictionary<string, string>(); users.Add("admin", "global"); users.Add("user", "client"); // 先判断登录名是否存在 if (users.ContainsKey(login)) { // 验证密码是否匹配 if (users[login] == password) { // 根据登录名判定用户类型 if (login == "admin") userType = UserType.Admin; else if (login == "user") userType = UserType.User; else userType = UserType.None; } else { // 密码不匹配,设为None userType = UserType.None; } } else { // 登录名不存在,设为None userType = UserType.None; } }
额外优化建议
- 可以把用户字典的初始化放到静态构造函数或者类的静态字段中,避免每次实例化
Auth都重复创建字典。 - 对输入的
login和password做Trim处理,避免用户输入空格导致验证失败。 - 不要直接公开
userType字段,改为属性封装更符合面向对象规范。
内容的提问来源于stack exchange,提问作者Lord Skr
相关产品推荐
相关产品推荐

