如何在C#登录逻辑中让MySQL校验mgroup_others列是否为7?
C# MySQL登录新增权限校验的问题修正
原运行代码(仅校验用户名密码)
private void button1_Click(object sender, EventArgs e) { string server = "207.244.70.217"; string database = "nextgene_NGH"; string uid = "EXAMPLEUID"; string password = "EXAMPLEPASSWORD"; string ssl = "None"; string connectionString = $"SERVER={server};DATABASE={database};UID={uid};PASSWORD={password};SSL Mode={ssl};"; using var connection = new MySqlConnection(connectionString); connection.Open(); using var command = new MySqlCommand("SELECT members_pass_hash FROM core_members WHERE name = @name;", connection); command.Parameters.AddWithValue("@name", maskedTextBox1.Text); var hashedPassword = (string) command.ExecuteScalar(); if (!(hashedPassword is null && !BCrypt.Net.BCrypt.Verify(maskedTextBox2.Text, hashedPassword))) { MessageBox.Show("Login Successful"); } }
需求说明
原代码仅能通过用户名和密码验证登录,现在需要新增校验逻辑:从core_members表的mgroup_others列取值,判断其值是否为7,只有同时满足密码正确且mgroup_others=7时,才允许登录。
用户改写的错误代码
private void button1_Click(object sender, EventArgs e) { string server = "207.244.70.217"; string database = "nextgene_NGH"; string uid = "EXAMPLEUID"; string password = "EXAMPLEPASSWORD"; string ssl = "None"; string vipcheck = "7"; string connectionString = $"SERVER={server};DATABASE={database};UID={uid};PASSWORD={password};SSL Mode={ssl};"; using var connection = new MySqlConnection(connectionString); connection.Open(); using var command = new MySqlCommand("SELECT members_pass_hash, mgroup_others FROM core_members WHERE name = @name;", connection); command.Parameters.AddWithValue("@name", maskedTextBox1.Text); var hashedPassword = (string) command.ExecuteScalar(); if (!(hashedPassword is null && !BCrypt.Net.BCrypt.Verify(maskedTextBox2.Text && vipcheck != mgroup_others, hashedPassword))) { MessageBox.Show("Login Successful"); } }
错误分析及修正代码
错误点:
- 数据读取方式错误:
ExecuteScalar()仅能获取查询结果的第一列第一行值,无法同时获取members_pass_hash和mgroup_others两个字段,需改用MySqlDataReader读取多字段。 - 条件判断语法/逻辑错误:
BCrypt.Verify的参数传递完全错误,将密码验证与权限校验逻辑混乱在一起,导致语法错误。 - 数据类型处理不当:
mgroup_others为数字类型,不应以字符串方式比较,直接用整数类型处理更准确。
修正后的代码:
private void button1_Click(object sender, EventArgs e) { string server = "207.244.70.217"; string database = "nextgene_NGH"; string uid = "EXAMPLEUID"; string password = "EXAMPLEPASSWORD"; string ssl = "None"; const int requiredMgroupValue = 7; // 定义常量存储需要校验的权限值 string connectionString = $"SERVER={server};DATABASE={database};UID={uid};PASSWORD={password};SSL Mode={ssl};"; using var connection = new MySqlConnection(connectionString); connection.Open(); // 同时查询密码哈希和权限字段 using var command = new MySqlCommand("SELECT members_pass_hash, mgroup_others FROM core_members WHERE name = @name;", connection); command.Parameters.AddWithValue("@name", maskedTextBox1.Text); // 使用DataReader读取查询结果 using var reader = command.ExecuteReader(); if (reader.Read()) // 确认是否找到匹配的用户 { string storedHashedPassword = reader.GetString("members_pass_hash"); int userMgroupValue = reader.GetInt32("mgroup_others"); // 同时校验密码正确性和权限值 if (BCrypt.Net.BCrypt.Verify(maskedTextBox2.Text, storedHashedPassword) && userMgroupValue == requiredMgroupValue) { MessageBox.Show("登录成功"); } else { MessageBox.Show("用户名/密码错误,或无权限登录"); } } else { MessageBox.Show("未找到该用户"); } }
代码说明:
- 使用
MySqlDataReader读取查询返回的多个字段,确保能获取到mgroup_others的值。 - 拆分校验逻辑:先验证密码是否正确,再判断
mgroup_others是否等于7,逻辑清晰且符合语法要求。 - 用整数类型处理
mgroup_others字段,避免字符串比较可能出现的问题。 - 增加了未找到用户的提示,提升用户体验。
内容的提问来源于stack exchange,提问作者Ryan Ellis
相关产品推荐
相关产品推荐

