C#多用户登录密码验证及登录尝试次数限制实现问题
问题修复方案
- 首先解决登录次数不累计的核心问题:你当前把
attempt变量定义在buttonLogin_Click方法内部,每次点击登录按钮都会重新初始化为1,永远无法累计到触发限制的阈值。需要把这个变量挪到窗体类的全局作用域,作为类成员变量。 - 调整计数逻辑:只有登录失败的时候才累加尝试次数,登录成功后可以把次数重置为初始值避免后续误触发限制。
- 补充资源释放逻辑:数据库连接、MySqlCommand等对象用完需要及时释放,避免资源泄漏。
- 额外优化建议:不要在数据库中明文存储用户密码,建议使用加盐哈希算法存储密码哈希值,校验时对比哈希值即可。
// 把attempt定义为窗体类的成员变量,放在所有方法外部 private int attempt = 1; private void buttonLogin_Click(object sender, EventArgs e) { if (attempt < 4) { using (MyDB db = new MyDB()) { DataTable table = new DataTable(); using (MySqlCommand command = new MySqlCommand("SELECT * FROM `users` WHERE `username` = @usn AND `password` = @pas", db.getConnection)) { command.Parameters.Add("@usn", MySqlDbType.VarChar).Value = textUsername.Text.Trim(); command.Parameters.Add("@pas", MySqlDbType.VarChar).Value = textBoxPass.Text; using (MySqlDataAdapter adapter = new MySqlDataAdapter(command)) { adapter.Fill(table); } } if (table.Rows.Count > 0) { // 登录成功重置尝试次数 attempt = 1; string userType = table.Rows[0]["type"]?.ToString() ?? ""; switch (userType) { case "student": this.Hide(); new StudentMain().Show(); break; case "faculty": this.Hide(); new FacultyMain().Show(); break; case "admin": this.Hide(); new AdminMain().Show(); break; default: MessageBox.Show("未知的用户类型", "登录错误", MessageBoxButtons.OK, MessageBoxIcon.Error); break; } } else { MessageBox.Show("无效的用户名或密码", $"尝试次数:{attempt}", MessageBoxButtons.OK, MessageBoxIcon.Error); // 只有登录失败才累加次数 attempt++; } } } else { MessageBox.Show("登录尝试次数已超限"); textUsername.Enabled = false; textBoxPass.Enabled = false; // 不需要直接关闭窗体可以注释掉下面这行 this.Close(); } }
内容的提问来源于stack exchange,提问作者Char
相关产品推荐
相关产品推荐

