Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/04/2004, 22h07   #1
Dry
Nouveau Membre du Club
 
Inscription : octobre 2003
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 48
Points : 26
Points : 26
Par défaut [role] Detecter le role des utilisateurs

Bonjour,

Je suis entrain de réaliser une interface d'administration pour gerer les utilisateurs de mon aplication.

J'utilise donc sous Delphi7 un TIBSecurityService pour ajouter et supprimer des utilisateurs.
Je cherche maintenant le moyen d'afficher tous les Utilisateurs referencés pour mon application. Facile ils ont tous un point communs : Il appartiennent tous au role 'ROLE_MON_APLLI'.

Recuperer la liste de tous les utilisateur se fait aisément a l aide d'un TIBSecurityService, en revanche, comment savoir si un utilisateur lamba appartient au role 'ROLE_MON_APLLI' ?


Merci
Dry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2004, 09h58   #2
Dry
Nouveau Membre du Club
 
Inscription : octobre 2003
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 48
Points : 26
Points : 26
Je répond partiellement à ma question, ce qui m'ammene à une nouvelle question :

en lancant cette requete :
Code :
SELECT * FROM RDB$user_privileges WHERE rdb$relation_name='MON_ROLE' AND rdb$privilege='M'
j'obtiens la liste de tous les utilisateurs membre du role 'MON_ROLE'.

Nouveau probleme : dans cette liste figure les utilisateurs qui ont ete créés, puis qui ont recu les privilege du role 'MON_ROLE', puis qui ont été supprimés. (ca me fait une belle jambe de savoir que l'utilisateur XXXX, qui a été supprimé y a 1 an, etait membre du role 'MON_ROLE').

donc ma nouvelle question :
Comment recuperer la liste de tous les utilisateurs "valide" au moment présent ? c'est à dire ceux qui peuvent ACTUELLEMENT se connecter à interbase ?
Dry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2004, 12h04   #3
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Il ne reste plus qu'à restreindre la liste avec la liste des utilisateurs retournés par le TIBSecurityService.

Et comme cette liste (les utilisateurs) se trouve dans la base isc4.gdb et qu'on ne peux pas faire de requete inter-base (c'est un comble ) (on ne peux pas faire une requete avec jointure qui utiliserai des tables se trouvant dans des bases différentes), il n'y a pas de solution en une seule requete.

Donc je vois plusieurs solutions :
1- Soit restreindre la liste manuellement.
2- Essayer un backup/restore (avec recréation de la base) pour voir si ça ne fait pas le ménage et du coup votre requete sera bonne.
3- Soit avant de supprimer un USER vous lui enlever les ROLES auquel il appartient.
4-Utiliser une UDF extistante (ou créer sa propre UDF), qui vérifierait si le USER existe encore dans isc4.gdb.

Voilà les pistes que j'explorerai.
Bonnes recherches. (Merci de nous tenir informer, ça peux interresser d'autres internautes )
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2004, 14h05   #4
Dry
Nouveau Membre du Club
 
Inscription : octobre 2003
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 48
Points : 26
Points : 26
Merci Bardibulle,
j'ai réaliser la permiere solution.

Voici un le bout de code qui permet de le réaliser en DELPHI7, si ca interesse certain :

Code :
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
27
28
//récupération de tous les users connu d'interbase
IBAdmin.DisplayUsers;
  for i := 0 to IBAdmin.UserInfoCount - 1 do
  begin
    if (premier) then
    begin
      S := s + 'rdb$user='''  + IBAdmin.UserInfo[i].UserName + '''';
      premier := false;
    end
    else S := s + ' OR rdb$user='''  + IBAdmin.UserInfo[i].UserName + '''';
  end;
// S est de la forme : RDB$USER='XXX' OR RDB$USER='YYY' OR RDB$USER='SYSDBA'
 
//je fais une requte classique sur la table RDB$USER qui renvoie une liste d'utilisateurs qui verifie que : 
// - chaque utilisateur est connu d'interbase
// - chaque utilisateur appartient au role 'MON_ROLE'
// - je force également l'affichage l'utilisateur SYSDBA (qui n'appartient pas forcément à 'MON_ROLE' mais qui a les droits dessus)
  IBSQL1.SQL.Clear;
  IBSQL1.SQL.ADD('select DISTINCT RDB$USER from RDB$user_privileges where (rdb$relation_name=''MON_ROLE'' and rdb$privilege=''M'' AND ('+s+') OR RDB$USER=''SYSDBA'') ORDER BY RDB$USER');
  IBSQL1.Open;
  i:=0;
  while NOT(IBSQL1.Eof) do
  begin
    grille.Cells[0,i] := IBSQL1.FieldByName('RDB$USER').AsString;
    i:=i+1;
    IBSQL1.Next;
  end;
  IBSQL1.Close;
Dry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2004, 14h35   #5
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Merci bien

J'ai juste une remarque, plutot que de faire
s := RDB$USER='USER1' OR RDB$USER='USER2' OR RDB$USER='USER3'
vous pouviez utiliser
RDB$USER in ('USER1','USER2','USER3')
et donc simplifier votre code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//récupération de tous les users connu d'interbase 
IBAdmin.DisplayUsers; 
  s := '';
  for i := 0 to IBAdmin.UserInfoCount - 1 do 
    s := s + QuotedStr(IBAdmin.UserInfo[i].UserName) + ',';
  s := leftStr(s, length(s)-1);
// S est de la forme : 'USER1','USER2','SYSDBA' 
 
//je fais une requete classique sur la table RDB$USER qui renvoie une liste d'utilisateurs qui verifie que : 
// - chaque utilisateur est connu d'interbase 
// - chaque utilisateur appartient au role 'MON_ROLE' 
// - je force également l'affichage l'utilisateur SYSDBA (qui n'appartient pas forcément à 'MON_ROLE' mais qui a les droits dessus) 
  IBSQL1.SQL.Clear; 
  IBSQL1.SQL.ADD('select DISTINCT RDB$USER from RDB$user_privileges where (rdb$relation_name=''MON_ROLE'' and rdb$privilege=''M'' AND RDB$USER IN('+s+') OR RDB$USER=''SYSDBA'') ORDER BY RDB$USER'); 
  IBSQL1.Open; 
  i:=0; 
  while NOT(IBSQL1.Eof) do 
  begin 
    grille.Cells[0,i] := IBSQL1.FieldByName('RDB$USER').AsString; 
    i:=i+1; 
    IBSQL1.Next; 
  end; 
  IBSQL1.Close;
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2004, 17h06   #6
Dry
Nouveau Membre du Club
 
Inscription : octobre 2003
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 48
Points : 26
Points : 26
hooo merci de l astuce !!

je pensais que l 'opérateur IN ne pouvait etre utilisé qu'avec une requete (pour son opérateur Droit).

effectivement je vais pouvoir clarifier mes requetes
Dry est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h43.


 
 
 
 
Partenaires

Hébergement Web