Comment puis-je en ouvrir deux différents en fonction des droits de l’utilisateur ?

la programmation


J’ai développé une application avec une base de données de serveur SQL. J’ai une table pour la connexion des utilisateurs avec l’administrateur et l’utilisateur normal. Le problème lorsque je me connecte avec un utilisateur normal, cela ouvre le formulaire pour l’administrateur ainsi que pour l’utilisateur normal. En bref, il ouvre deux formulaires lorsque je me connecte avec un utilisateur normal. Veuillez aider.

Ce que j’ai essayé :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Stokvel_Management_System
{
    public partial class Login : Form
    {
        public Login()
        {
            InitializeComponent();
        }
        public string constring = "Data Source=LAPTOP-TINYIKOB\\SQLEXPRESS;Initial Catalog=Stokvel;Integrated Security=True";
                         
        private void BtnLogin_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(constring);
            con.Open();
            
            SqlDataAdapter da = new SqlDataAdapter("select count(*) from loginTab where UserName='" + txtUsername.Text + "' and Password='" + txtPassword.Text + "'and Type='" + UsercomboBox.Text + "'", con);
            DataTable dt = new DataTable();
            da.Fill(dt);
            if (dt.Rows[0][0].ToString() == "1")
            {
                SqlDataAdapter da1 = new SqlDataAdapter("select Type from loginTab where UserName='" + txtUsername.Text + "' and Password='" + txtPassword.Text  + "'", con);
                DataTable dt1 = new DataTable();
                da1.Fill(dt1);
                if (dt1.Rows[0][0].ToString() == "Admin")
                    con.Close();
                {
                    Hide();
                    Admin ad = new Admin();
                    ad.Show();
                }
                if(dt1.Rows[0][0].ToString()=="User")
                {
                    Hide();
                    User us = new User();
                    us.Show();
                    
                }
            }

            
            }

        }
    }

Solution 2

Cela me semble excessivement complexe. Tout ce dont vous avez vraiment besoin est de lire la ligne qui correspond au nom d’utilisateur et au mot de passe donnés et renvoie le type d’utilisateur. Avec ces informations, vous pouvez ensuite ouvrir le formulaire d’administrateur ou d’utilisateur. Créer deux adaptateurs de données et tables de données uniquement pour lire une seule ligne constitue un gaspillage de ressources. Quelque chose comme:

C#
string queryString = "select Type from loginTab where UserName='" + txtUsername.Text + "' and Password='" + txtPassword.Text  + "'";
string usertype = "None";
using (SqlConnection connection = new SqlConnection(
           connectionString))
{
    SqlCommand command = new SqlCommand(
        queryString, connection);
    connection.Open();
    using(SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            usertype = reader[0]; // returned value
        }
    }
}
if (usertype == "Admin")
{
    Hide();
    Admin ad = new Admin();
    ad.Show();
}
else if(usertype == "User")
{
    Hide();
    User us = new User();
    us.Show();   
}
else
{
    // invalid type, or no matching record.
}

Solution 1

Vous avez les pires problèmes à résoudre en premier, je vais donc vous expliquer ce que vous avez remarqué en dernier.

1) Ne concaténez jamais de chaînes pour créer une commande SQL. Cela vous laisse grand ouvert aux attaques accidentelles ou délibérées par injection SQL qui peuvent détruire l’intégralité de votre base de données. Utilisez toujours des requêtes paramétrées à la place.

Lorsque vous concaténez des chaînes, vous posez des problèmes car SQL reçoit des commandes telles que :

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'

La citation ajoutée par l’utilisateur termine la chaîne en ce qui concerne SQL et vous rencontrez des problèmes. Mais cela pourrait être pire. Si j’arrive et tape ceci à la place : “x’;DROP TABLE MyTable;–” Alors SQL reçoit une commande très différente :

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'

Ce que SQL considère comme trois commandes distinctes :

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';

Un SELECT parfaitement valide

SQL
DROP TABLE MyTable;

Une commande “supprimer la table” parfaitement valide

SQL
--'

Et tout le reste n’est qu’un commentaire.
C’est ce qui se passe : sélectionne toutes les lignes correspondantes, supprime la table de la base de données et ignore tout le reste.

Utilisez donc TOUJOURS des requêtes paramétrées ! Ou soyez prêt à restaurer fréquemment votre base de données à partir d’une sauvegarde. Vous effectuez régulièrement des sauvegardes, n’est-ce pas ?

Et sur un écran de connexion ? C’est franchement suicidaire car je n’ai même pas besoin d’être un utilisateur pour détruire votre base de données !

2) Ne stockez jamais les mots de passe en texte clair – cela constitue un risque de sécurité majeur. Il y a quelques informations sur la façon de procéder ici : Stockage des mots de passe : comment procéder.[^]

Et rappelez-vous : si vous avez des utilisateurs dans l’Union européenne, le RGPD s’applique et cela signifie que vous devez traiter les mots de passe comme des données sensibles et les stocker de manière sûre et sécurisée. Le texte n’est ni l’un ni l’autre et les amendes peuvent être… euh… exceptionnelles. En décembre 2018, une entreprise allemande a été condamnée à une amende relativement faible de 20 000 euros pour ce seul motif.

3) Vous ne vérifiez pas si la base de données a renvoyé des lignes : si vous faites une erreur de frappe, une erreur “index hors plage” sera générée et votre application plantera.

4) Vous fermez uniquement la connexion pour les administrateurs. Au lieu de fermer manuellement la connexion, entourez tout le code DB dans using bloque et le système se mettra automatiquement en ordre pour vous.

5) Le problème que vous avez remarqué… Regardez votre code :

if (dt1.Rows[0][0].ToString() == "Admin")
    con.Close();
{
    Hide();
    Admin ad = new Admin();
    ad.Show();
}

Si la condition correspond, il ferme la connexion. Ensuite, il exécute toujours le code entre accolades même si la condition ne correspond pas…

コメント

タイトルとURLをコピーしました