【问题标题】:How can i pass a value to a label from a database based on the users details如何根据用户详细信息将值从数据库传递给标签
【发布时间】:2021-08-08 22:08:19
【问题描述】:

我有一个登录表,每个用户都有不同的角色,例如员工、管理员。
我可以让用户成功登录,他们的用户名显示在控制台应用程序的页面之间。
我正在尝试在用户名标签旁边添加一个新标签,因此登录后下一页将有类似这样的内容 Admin: Johny or Staff: Bob

我试图做的是将查询更改为:

"SELECT Role From User_Table WHERE eb_number='" + usernametxt.Text + "' and Password = '" + textBox1.Text + "'",con);

但这也不起作用。

private void loginbtn_Click(object sender, EventArgs e)
{

    //GRANT ACCESS TO THE DATABASE WITH USERNAME AND PASSWORD WHICH IS STORED IN THE DATABASE.
    SqlConnection con = new SqlConnection(conString);
    con.Open();
    if (con.State==System.Data.ConnectionState.Open)
    {
        SqlDataAdapter sda = new SqlDataAdapter("SELECT Count(*) From User_Table WHERE eb_number='" + usernametxt.Text + "' and Password = '" + textBox1.Text + "'",con);
        DataTable dt = new DataTable();
        sda.Fill(dt);
        if (dt.Rows[0][0].ToString() == "1")
        {
            this.Hide();

            Main ss = new Main(usernametxt.Text); //usernametxt is passed in to prevent error
            ss.Show();
            MessageBox.Show("Logged in sucessfully");

        }
        else
        {
            MessageBox.Show("Incorrect Username/Password Combination. Try Again");
        }
    }
}

Main.cs

    public Main(string Username/*, string Role*/) //passing username values 
    {
        InitializeComponent();
        Username_lbl.Text = Username;  //Displaying  username 
        //Main_Role_lbl.Text = Role;

在那一刻,我的代码只允许我登录和退出阅读用户名和密码。我不确定我是否可以通过这种方式添加在 SQL 查询中搜索用户名的角色?我期望它的代码做的是像 Admin: Johny 或 Staff: Bob 这样的登录

【问题讨论】:

  • 和调用SQL一样,检查结果看用户名/密码是否正确,直接调用另一条SQL获取角色即可。
  • 关于您的代码的离题但必要的建议: - 在查询中使用参数而不是字符串连接。 - 不要将密码作为明文存储在数据库中,使用散列函数计算密码散列并保存。 - 始终处置您的连接对象。请对上述主题进行一些研究。
  • 如果您在用户和角色表之间有某种关系会更容易,登录时您将获取用户的 ID(或每一列)并使其全局可用,如果获取result != null 这意味着您的用户存在并且您可以继续使用。之后,您有一个 ID,如果您需要知道用户的角色是什么,您只需从角色表中获取数据,其中 ID = 您的全局可用 ID。查询看起来像这样:“select * from Users where Username = @username and password = @password”和“select RoleName from Roles where UserID = @userID”
  • 首先,使用参数化查询。想象一下what will happen,如果有人在textBox1 中输入'; drop table users;--。其次,不要编写自己的验证码。密码永远不会以明文形式存储或加密。它们被加盐,使用加密哈希算法进行至少 1000 次迭代,并且只存储哈希
  • 有人也可以输入' 1=1 作为密码。或' or Role='Admin'.

标签: c# sql sql-server


【解决方案1】:

这里有一些类似于你的实现的东西:

private void loginbtn_Click(object sender, EventArgs e)
{
    var conString = "ReplaceWithMyConnectionString";
    string userRole = null;

    using (var con = new SqlConnection(conString))
    {
        con.Open();

        var cm = con.CreateCommand();
        cm.CommandType = System.Data.CommandType.Text;
        cm.CommandText = "SELECT TOP 1 Role FROM User_Table WHERE eb_number = @eb_number AND and Password = @Password";
        cm.Parameters.Add(new SqlParameter("@eb_number", System.Data.SqlDbType.VarChar, 50) { Value = usernametxt.Text });
        cm.Parameters.Add(new SqlParameter("@Password", System.Data.SqlDbType.VarChar, 50) { Value = textBox1.Text });

        using (var reader = cm.ExecuteReader(System.Data.CommandBehavior.SingleRow))
        {
            if (reader.Read())
            {
                userRole = reader["Role"].ToString();
            }
        }
    }

    if (userRole != null)
    {
        this.Hide();

        Main ss = new Main(usernametxt.Text, userRole); //usernametxt is passed in to prevent error
        ss.Show();
        MessageBox.Show("Logged in sucessfully");
    }
    else
    {
        MessageBox.Show("Incorrect Username/Password Combination. Try Again");
    }
}

有一些不同的地方,我会解释它们背后的原因:

  • 我用参数替换了您在 SQL 上执行的字符串连接。这是为了避免 SQL 注入。你有没有想过 如果用户在 用户名或密码文本框?还有更多,请研究这个主题。
  • 我正在using 语句中实例化您的连接。这将确保在我们完成 db 内容后您的连接已关闭(处置)。
  • 将 DataAdapter/DataTable 替换为更精简的 SqlCommand/SqlDataReader 类。
  • 我以一种可以尽快关闭连接的方式分离逻辑,并且不会因调用 MessageBox.Show() 而中断。

另外,非常重要的是,永远不要将您的密码以明文形式存储在数据库中,请对散列函数进行一些研究,以及为什么应该在这种情况下使用它们。

我希望这会有所帮助。

【讨论】:

  • 这行得通。必须更改 SQL 语句,因为其中有 2 个“AND”,但效果很好。
猜你喜欢
  • 2016-08-08
  • 1970-01-01
  • 2019-04-27
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 2022-01-17
相关资源
最近更新 更多