IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

les droits des Groupes sur les boutons


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Par défaut les droits des Groupes sur les boutons
    salut
    j’ai la base de données suivante qui contient deux tables: (GROUPES,USERS) pour gérer les droits des groupes :
    Script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    CREATE TABLE GROUPES (
      ID_GROUPE         SMALLINT NOT NULL,
      DESCRIPTION       VARCHAR(30) NOT NULL,
      DROITS_Button1    SMALLINT ,
      DROITS_BUTTON2    SMALLINT,
      /* Keys */
      CONSTRAINT PK_GROUPE
        PRIMARY KEY (ID_GROUPE)
    );
     
    CREATE TABLE USERS (
      ID_USER     SMALLINT NOT NULL,
      NOM         VARCHAR(30) NOT NULL,
      MotPass    VARCHAR(30),
      ID_GROUPE   SMALLINT,
      /* Keys */
      CONSTRAINT PK_USERS
        PRIMARY KEY (ID_USER),
      /* Foreign keys */
      CONSTRAINT FK_USER_GROUPES
        FOREIGN KEY (ID_GROUPE)
        REFERENCES GROUPES(ID_GROUPE)
        ON DELETE CASCADE
        ON UPDATE CASCADE
    );
    Insertion des enregistrements
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    INSERT INTO GROUPE_PRV (ID_GROUPE, DESCRIPTION, DROITS_Button1, DROITS_BUTTON2) VALUES (1, 'administrateur', 1,1);
    INSERT INTO GROUPE_PRV (ID_GROUPE, DESCRIPTION, DROITS_Button1, DROITS_BUTTON2) VALUES (2, 'superviseur', 0,1);
    INSERT INTO GROUPE_PRV (ID_GROUPE, DESCRIPTION, DROITS_Button1, DROITS_BUTTON2) VALUES (3, 'Staff', 1,0);
    COMMIT;
     
    INSERT INTO USERS (ID_USER, NOM, MotPass, ID_GROUPE) VALUES (1, 'admin', 'test', 1);
    INSERT INTO USERS (ID_USER, NOM, MotPass, ID_GROUPE) VALUES (1, 'David', '123456', 2);
    INSERT INTO USERS (ID_USER, NOM, MotPass, ID_GROUPE) VALUES (1, 'Devloper', '1234', 3);
    COMMIT;
    dans la form1 j'ai deux boutons (Button1,Button1=2)

    pour donner à chaque groupe une droit pour chaque bouton Nous écrivons l'un des deux nombres dans les deux champs (DROITS_Button1, DROITS_BUTTON2)
    le numéro 0 veut dire que Le groupe n'a pas d'autorisation, ce qui signifie que le bouton est désactivé
    le numéro 1 veut dire que Le groupe a l'autorisation, ce qui signifie que le bouton est Activé


    pour charge les droit d'un utilisateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
                 with FDQuery1 do
                  begin
                  Close;
                  SQL.Clear;
                  SQL.Add('SELECT DROITS_Button1,DROITS_Button2 FROM GROUPES');
                  SQL.Add(' WHERE DESCRIPTION=:ParmDESCRIPTION');
                  ParamByName('ParmDESCRIPTION').value:=FormAuthentification.EditUserName.Text;
                  Open;
                  end;
     
      if DataModule1.FDQuery1.FieldByName('DROITS_Button1').asInteger=0 then  Button1.Enabled:=False
      else Button1.Enabled:=True          
     
      if DataModule1.FDQuery1.FieldByName('DROITS_Button2').asInteger=0 then
                 Button2.Enabled:=False
                 else Button2.Enabled:=True
    end;

    -C'est l'idée avec laquelle je travaille pour les droit des forms

    -Supposons que j'ai 8 forms dans chaque form, il y a 10 boutons
    Cela signifie que j'ajouterai 80 champs dans le table GROUPES (DROIT_button1....DROIT_button80) Pour moi c'est trop De plus, Firebird a un nombre maximum de champs autorisés dans chaque table

    Mes questions sont:
    1-Est-ce une bonne méthode et qu'en pensez-vous.
    2-y a-t-il une meilleure méthode?

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 093
    Par défaut
    Mauvaise structure* ...
    pense verticalement en non horizontalement
    pense Jointure et non colonne

    * pour une base de donnes relationnel
    Dans certains cas un champ de bit peut être justifié, par exemple une carte d'accès et quelques milliers de porte sécurisée.
    Il est plus facile de transformer un ensemble de données relationnel vers un modèle à plat que la réciproque
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    pense verticalement en non horizontalement
    tu veux dire: de mettre dans la table GROUPES un champ appelé droit À la place des deux champs(DROITS_Button1,DROITS_Button2) ?
    Peux-tu m'expliquer plus pour que je comprenne

    Citation Envoyé par ShaiLeTroll Voir le message
    pense Jointure et non colonne
    Vous avez raison. Je savais l'erreur dans laquelle je suis tombé ...
    J'étais censé faire une jointure de la table GROUPES avec USERS ...Merci pour l'avertissement

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 649
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 649
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Non, je pense que ShaiLeTroll pensait à quelque chose comme
    table Boutons(id_compo,id_groupe....) avec des relations foreign key
    parce que quand il y aura une trentaine de boutons ta table GROUPE_PRV va devenir

    La technique de Paul, est d'utiliser un colonne codée sur x bits et de tester si le bit est on ou off un smallint (32 bits) te permettra d'affecter les droits à 32 composants (boutons, TEdit ...)
    un BIGINT à 64 , un NUMERIC(18,0) à 144 (bon pour ce dernier, c'est théorique, je ne crois pas que cela soit aisé). Avec un CHAR(x) cela doit même être possible

    Donc une seule colonnes exemple
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    DROITS_BOUTONS  BIGINT DEFAULT 0;
    et un test sur le bit adéquat pour savoir si le bouton est à activer ou non. Bien sur il faut qu'au bouton soit indiqué (par exemple la valeur du Tag) de quel bit il s'agit soit en valeur.
    L'exemple de Paul propose les valeurs 1,2,4,8,16,32,64 ... donc des 2n, perso j'aime bien utiliser les positions de 1 à 32

    Pour information, Firebird permet la manipulation de bits (FB 2.1 et >) , mais il est possible de faire des UDF (j'en ai d'ailleurs fait pour ce genre de colonnes quand je n'avais qu'IB 5.0)

    Je n'ai pas compris où mettre ce code
    dans le programme bien sûr
    je n'avais jamais utilisé la commande shl auparavant
    il est temps de regarder les diverses instructions sur les bits si vous adoptez cette technique

  5. #5
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,
    parce que quand il y aura une trentaine de boutons ta table GROUPE_PRV va devenir
    Juste une faute de frappe Il n'y a que deux tables: (GROUPES,USERS)

    Citation Envoyé par SergioMaster Voir le message
    Avec un CHAR(x) cela doit même être possible
    1-Quel est le maximum droit pour le type CHAR(x) ?


    2-Après avoir confirmé que le mot de passe est correct , en stocker la valeur quelque part par exemple en variable VARDroits de type BIGINT

    VARDroits:=FDQuery1.FieldByName('Droits').asInteger;

    donc le code OnCreate contiendra (pour permet appliquer les droits pour l'utilisateur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     Button1.enabled:=VARDroits AND (1 shl 1)<>0;
     Bouton2.enabled:=VARDroits AND (1 shl 2)<>0;
     Bouton3.enabled:=VARDroits AND (1 shl 3)<>0;
    Est-ce vrai ?

    Une autre question qui demeure est de savoir comment déterminer la valeur d’enregistrement qui se trouve dans le champ DROITS
    Supposons que nous ayons 5 boutons
    et le groupe superviseur accès uniquement aux: bouton1 et bouton5 Cela signifie que :

    le bit numéro 1 et le numéro 5 porteront le numéro 1, ce qui signifie que le nombre résultant en binaire est (10001) =1+16=17 en décimal)

    veux dire, nous enregistrerons le numéro 17 dans un champ DROIT pour le groupe superviseur
    Comment exécutons-nous ce processus lors de l'octroi d'autorisations à un utilisateur spécifique? Autrement dit, comment calculons-nous le nombre 17

  6. #6
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    donc la proposition de Shai c'est de faire une table de droits par bouton du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      CREATE TABLE DROITSBOUTON (
        BOUTON INT
        UTILISTATEUR INT
      );
    la table contenant le numéro du bouton et l'utilisateur qui a le droit sur ce bouton

    ma proposition c'est d'utiliser un entier pour stocker les droits

    en Delphi c'est un SET OF

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    type
      TBoutons = (bouton1, bouton2, bouton4, bouton5...);
      TDroits = set of TBoutons;
    var
      Droits: TDroids;
    begin
      Droits := [bouton2, bouton4];
     
      Query.FieldByName('DROITS').AsInteger := Ord(Droits);
     
      Droits := TDroits(Query.FieldByName('DROITS').AsInteger;
    end;
    le seul truc pénible c'est que pour que la conversion fonctionne il faut que le champ et le SET OF aient la même taille (cf {$MINENUMSIZE } ou utiliser Byte(Droits), ou Word(Droits) selon le cas)

    on peut s'en sortir aussi avec un record
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    type
      TDroids = record
      case Boolean of  
        True: (Boutons: set of TBouttons)
         False:(Int: Integer);
      end;
    var
      Droits: TDroits;
    begin
      Droits.Int := 0; // pas de droit
      Droits.Boutons := [bouton2]; // Droits.Int = 2
      Droits.Boutons := [boutton2, bouton3]; // Droits.Int = 2 + 4 = 6
     
      Query.FieldByName('DROITS').AsInteger := Droits.Int;
     
      Droits.Int := Query.FieldByName('DROITS').AsInteger;
     
      if button2 in Droits.Buttons then
      begin
      end;
    end;
    attention, Droits.Int := 0 et Droits.Boutons := [] ne sont équivalent que si le SET OF a une taille sur 32bits, s'il est sur 8bits, les 24 autres bits seront indéterminés si on affecte uniquement Boutons...avec les Managed Record on pourra utiliser un class operator initialize qui forcera Int à 0 par défaut histoire de ne pas oublier de le faire
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par delphi2019 Voir le message
    Juste une faute de frappe Il n'y a que deux tables: (GROUPES,USERS)


    1-Quel est le maximum droit pour le type CHAR(x) ?


    2-Après avoir confirmé que le mot de passe est correct , en stocker la valeur quelque part par exemple en variable VARDroits de type BIGINT

    VARDroits:=FDQuery1.FieldByName('Droits').asInteger;

    donc le code OnCreate contiendra (pour permet appliquer les droits pour l'utilisateur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     Button1.enabled:=VARDroits AND (1 shl 1)<>0;
     Bouton2.enabled:=VARDroits AND (1 shl 2)<>0;
     Bouton3.enabled:=VARDroits AND (1 shl 3)<>0;
    Est-ce vrai ?
    oui

    Citation Envoyé par delphi2019 Voir le message

    Une autre question qui demeure est de savoir comment déterminer la valeur d’enregistrement qui se trouve dans le champ DROITS
    Supposons que nous ayons 5 boutons
    et le groupe superviseur accès uniquement aux: bouton1 et bouton5 Cela signifie que :

    le bit numéro 1 et le numéro 5 porteront le numéro 1, ce qui signifie que le nombre résultant en binaire est (10001) =1+16=17 en décimal)

    veux dire, nous enregistrerons le numéro 17 dans un champ DROIT pour le groupe superviseur
    Comment exécutons-nous ce processus lors de l'octroi d'autorisations à un utilisateur spécifique? Autrement dit, comment calculons-nous le nombre 17
    et bien 17 = 1 + 16 = (1 shl 0) + (1 shl 4), donc boutons 1 et 5 ... car le bouton1 porte l'index 0
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    il suffit d'utiliser un entier et des bits

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    button1 := Champ and 1 <> 0
    button2 := Champ and 2 <> 0
    button3 := Champ and 4 <> 0
    ...
    buttonx := Champ and (1 shl x) <> 0
    sur un seul entier 32 bits tu peux coder 32 butons
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 182
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    il suffit d'utiliser un entier et des bits

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    button1 := Champ and 1 <> 0
    ...
    buttonx := Champ and (1 shl x) <> 0
    sur un seul entier 32 bits tu peux coder 32 butons
    Je n'ai pas compris où mettre ce code et je n'avais jamais utilisé la commande shl auparavant

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. les droits des Groupes d'utilisateurs
    Par unja2010 dans le forum Delphi
    Réponses: 15
    Dernier message: 24/07/2018, 18h53
  2. [Bugzilla] Gestion des groupes sur les produits
    Par zerbynette dans le forum Autres
    Réponses: 0
    Dernier message: 16/04/2010, 16h45
  3. POO MVC2 et gestion des droits des utilisateurs sur les modèles.
    Par Dankin dans le forum Langages de programmation
    Réponses: 0
    Dernier message: 02/06/2009, 21h26
  4. Réponses: 3
    Dernier message: 13/04/2006, 13h08
  5. [Debutant]droits des utilisateurs sur sql serveur
    Par christophebmx dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/01/2005, 16h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo