【问题标题】:C# how do i direct users to different forms based on their roleC#如何根据用户的角色将用户引导到不同的表单
【发布时间】:2016-02-12 00:31:33
【问题描述】:

我已将一个名为 Data 的 SQL 数据库连接到 Visual Studio C# 中的一个 Windows 窗体应用程序,该数据库包含一个名为 Login 的表。

表格显示如下:

这是数据在我的表中的外观的图片链接,所以基本上我将拥有用户名、密码和角色(我有两种类型的角色,这意味着用户是管理员或客户):

我制作了一个名为 Login 的登录表单,用户可以在其中输入数据库中的用户名和密码,这会将他们带到我称为 AdminMenu 的表单。我还制作了一个名为 MenuForm 的表单,我希望角色为 Client 的用户在登录时被定向到该表单。

问题是我只进行了登录,以便所有用户在登录时都会被引导到 AdminMenu,即使他们的角色不是管理员。有人可以修改我的代码,以便在登录时将具有 Client 角色的用户定向到 MenuForm,而将具有 Admin 角色的用户定向到 AdminMenu 表单。

这是我的登录表单代码:

    private void button2_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void button3_Click(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|Data.mdf;Integrated Security=True");
        SqlDataAdapter sda = new SqlDataAdapter("Select Role from Login Where UserName='" + textBox1.Text + "' and Password='" + textBox2.Text + "'   ",con);
        DataTable dt = new System.Data.DataTable();
        sda.Fill(dt);
        if(dt.Rows.Count == 1)
        {
            this.Hide();
            AdminMenu ss = new AdminMenu();
            ss.Show();

        }

    }

    private void Login_Load(object sender, EventArgs e)
    {

    }
}

}

【问题讨论】:

  • 这个问题与我如何重定向到 URL 不同。因为我希望用户在登录时根据他们在数据库中的角色被引导到特定的表单,而不是像其他问题那样被引导到特定的网页。

标签: c# sql-server forms login


【解决方案1】:

可以说在这里使用 DataAdapter 没有充分的理由,您应该更好地防止注入攻击,并且您可能需要考虑密码加盐,并且可能需要考虑表单父级,但根据您的代码,以下应该可以工作:

// ...
if(dt.Rows.Count == 1)
{
    switch (dt.Rows[0]["Role"] as string)
    {
        case "Admin":
        {
            this.Hide();
            AdminMenu ss = new AdminMenu();
            ss.Show();
            break;
        }

        case "Client":
        {
            this.Hide();
            MenuForm mf = new MenuForm();
            mf.Show();
            break;
        }

        default:
        {
            // ... handle unexpected roles here...
            break;
        }
    }
}

您可以在没有适配器的情况下执行命令:

var cmd = conn.CreateCommand();
cmd.CommandText = "Select Role from Login Where UserName=@user and Password=@password";
var up = cmd.CreateParameter();
up.ParameterName="@user";
up.Value = textBox1.Text;
cmd.Parameters.Add(up);
var pp = cmd.CreateParameter();
pp.ParameterName="@password";
pp.Value = textBox2.Text;
cmd.Parameters.Add(pp);

var role = cmd.ExecuteScalar() as string;
// further processing... - role will be null if user not found

【讨论】:

  • 谢谢 Ben Jackson 的回答,它有效,我现在可以根据用户类型登录两种不同的表单。我也尝试过在没有适配器的情况下使用您的方式,但出现一个错误,显示名称 conn 在当前上下文中不存在。
  • 对不起,应该是 con(你的连接对象)而不是 conn。
  • 如何以及在哪里为登录表单代码添加验证,以便当用户在尝试登录时输入错误信息时,它可以包含一个显示用户名或密码不正确的消息框?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 2019-09-24
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 2015-09-09
  • 1970-01-01
相关资源
最近更新 更多