Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 26/06/2008, 00h29   #1
Membre habitué
 
Inscription : juillet 2004
Messages : 254
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juillet 2004
Messages : 254
Points : 114
Points : 114
Par défaut [PORTAL][TIP] Retrouver tous les groupes d'un utilisateur

Bonjour
Ceux qui utilisent Oracle Portal savent combien il est est difficile de retrouver tous les groupes auxquels appartient un utilisateur.
En effet au niveau de la page "Générateur" (Builder) il n'y a strictement rien, et au niveau du logiciel Oracle Directory Manager on peut faire une recherche dans les groupes suivant le critere "uniquemember" mais on obtient qu'une recherche de premier niveau, et il faut se taper la récursitivité à la main.
J'ai donc développé mon propre petit outil bien pratique afin de retrouver en un clic TOUS les groupes auquel un utilisateur (ou même un groupe) appartient, en prenant en compte l'héritage.
Pour ceux à qui cela pourra servir ...
A+
Loko

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
 
CREATE OR REPLACE PROCEDURE GET_OID_GROUP_MEMBERSHIP (p_entry IN VARCHAR2) IS
/******************************************************************************
   NAME:       GET_OID_GROUP_MEMBERSHIP
   PURPOSE:
        Pour un user, affiche tous les groupes dont il est membre,
       en récursif ou non
     Pour un groupe : idem + liste ses propres membres.
******************************************************************************/
 retval              PLS_INTEGER;
 my_session          DBMS_LDAP.session;
 
 subscriber_handle   DBMS_LDAP_UTL.HANDLE;
 sub_type            PLS_INTEGER := DBMS_LDAP_UTL.TYPE_DN;
 subscriber_id       VARCHAR2(2000) := 'dc=groupe-atlantic,dc=com';
 my_attrs            DBMS_LDAP.STRING_COLLECTION;
 my_pset_coll        DBMS_LDAP_UTL.PROPERTY_SET_COLLECTION;
 my_property_names   DBMS_LDAP.STRING_COLLECTION;
 my_property_values  DBMS_LDAP.STRING_COLLECTION;
 group_handle        DBMS_LDAP_UTL.HANDLE;
 group_id            VARCHAR2(2000);
 group_type          PLS_INTEGER := DBMS_LDAP_UTL.TYPE_DN;
 user_handle         DBMS_LDAP_UTL.HANDLE;
 user_id             VARCHAR2(2000);
 user_type           PLS_INTEGER := DBMS_LDAP_UTL.TYPE_DN;
 lb_is_group         BOOLEAN := false;
 lb_is_user          BOOLEAN := false;
 
 lc_temp             VARCHAR2(2000);
 
BEGIN 
 
 retval := connect_to_oid(my_session);
 IF retval <> DBMS_LDAP.SUCCESS Then
     htp.p('Erreur de connexion a la base (connect_oid)');
  RETURN;
 End IF; 
 
 -- Create Subscriber Handle
 retval := DBMS_LDAP_UTL.create_subscriber_handle(subscriber_handle, sub_type, subscriber_id);
 IF retval != DBMS_LDAP_UTL.SUCCESS  Then
    Htp.p('create_subscriber_handle returns : ' || to_char(retval));
 End IF;
 -- Verifie la validité de l'entrée saisie
 IF existe_oid_user(p_entry)  = DBMS_LDAP.SUCCESS Then lb_is_user  := True; End IF;
 IF existe_oid_group(p_entry) = DBMS_LDAP.SUCCESS Then lb_is_group := True; End IF;
 
 IF NOT lb_is_user AND NOT lb_is_group Then
     Htp.p('Utilisateur ou Groupe '||p_entry||' inconnu');
     RETURN;
 End IF;
 
 IF lb_is_group Then
 
  group_id := 'cn='||p_entry||','||common.ldap_base_groups;
  user_id  := group_id; -- on s'en sert comme un user pour la recherche get_group_membership
 
  -- Create Group Handle
   retval := DBMS_LDAP_UTL.create_group_handle(group_handle,group_type,group_id);
  IF retval != DBMS_LDAP_UTL.SUCCESS  Then
      Htp.p('create_group_handle returns : ' || to_char(retval));
  End IF;
   -- Set Group handle properties (link subscriber to group )
   retval := DBMS_LDAP_UTL.set_group_handle_properties(group_handle, DBMS_LDAP_UTL.SUBSCRIBER_HANDLE, subscriber_handle);
  IF retval != DBMS_LDAP_UTL.SUCCESS  Then
      Htp.p('set_group_handle_properties returns : ' || to_char(retval));
  End IF;
 
 Else
   user_id := 'cn='||p_entry||',cn=users,dc=groupe-atlantic,dc=com';
 End IF;
 
 -- Create User Handle
 retval := DBMS_LDAP_UTL.create_user_handle(user_handle,user_type,user_id);
 IF retval != DBMS_LDAP_UTL.SUCCESS  Then
     Htp.p('create_user_handle returns : ' || to_char(retval));
 End IF;
 -- Set User handle properties
 retval := DBMS_LDAP_UTL.set_user_handle_properties(user_handle, DBMS_LDAP_UTL.SUBSCRIBER_HANDLE, subscriber_handle);
 IF retval != DBMS_LDAP_UTL.SUCCESS  Then
     Htp.p('set_user_handle_properties returns : ' || to_char(retval));
 End IF;
 
 
 -- Debut d'écriture en sortie
 Htp.p('<font face=Verdana size="1"><table align=center border=1 style="font-family:Verdana; font-size:12px">');
 Htp.p('<tr align=center style="font-weight:bold; background-color:#006699; color:#FFFFFF">');
 IF lb_is_group Then
  Htp.p('<td>Membres</td><td>&nbsp;Groupe cherch&eacute;&nbsp;</td><td>Est membre de<br>(1er niveau)</td><td>Est membre de<br>(tous niveaux)</td>');
 Else
  Htp.p('<td>&nbsp;Utilisateur&nbsp;</td><td>Est membre de<br>(1er niveau)</td><td>Est membre de<br>(tous niveaux)</td>');
 End IF; 
 Htp.p('</tr><tr valign="middle">');
 
 
 -- 1ere colonne : affiche les membres pour un groupe
 IF lb_is_group Then
 
   Htp.p('<td>');
 
   my_attrs (1) := 'uniquemember';
   retval       := dbms_ldap_utl.get_group_properties (my_session,group_handle,my_attrs,dbms_ldap_utl.entry_properties,my_pset_coll);
   IF retval != dbms_ldap_utl.success Then
      Htp.p(''); --Htp.P('get_group_properties returns : ' || TO_CHAR (retval));
   End IF;
   IF my_pset_coll.COUNT > 0 Then
      FOR i IN my_pset_coll.FIRST .. my_pset_coll.LAST Loop
         retval := dbms_ldap_utl.get_property_values (my_pset_coll (i),my_attrs (1), my_property_values);
         IF my_property_values.COUNT > 0 Then
            FOR k IN my_property_values.FIRST .. my_property_values.LAST Loop
               --If INSTR (UPPER (my_property_values (k)), 'CN=USERS') > 0 Then
                  lc_temp := SUBSTR (my_property_values (k), (INSTR (my_property_values (k), '=') + 1 ) );
                  lc_temp := SUBSTR (lc_temp, 0, (INSTR (lc_temp, ',') - 1));
      IF lc_temp <> 'portal' Then Htp.p(lc_temp); Htp.br; End IF;
               --End If;
            End Loop;
         End IF;
      End Loop;
   End IF;
 
   Htp.p('</td>');
 
 End IF;
 
 
 -- 2ème colonne : affiche l'entrée saisie
 Htp.p('<td align=center><strong>'||p_entry||'</strong></td>');
 
 -- 3ème colonne : affiche le membership sur 1 niveau
 Htp.p('<td>');
 
 -- Get Group Membership SUR 1 NIVEAU
 my_attrs.DELETE();
 my_attrs(1) := 'cn';
 retval := DBMS_LDAP_UTL.get_group_membership ( my_session,
                                user_handle,
                                DBMS_LDAP_UTL.DIRECT_MEMBERSHIP,
                                my_attrs,
                                my_pset_coll );
 IF retval != DBMS_LDAP_UTL.SUCCESS  Then
      Htp.p(''); --Htp.p('get_group_membership returns : ' || to_char(retval));
 End IF;
 IF my_pset_coll.COUNT > 0 Then
   FOR i IN my_pset_coll.FIRST .. my_pset_coll.LAST Loop 
     retval := dbms_ldap_utl.get_property_values (my_pset_coll (i),my_attrs (1), my_property_values);
     IF my_property_values.COUNT > 0 Then  
        FOR k IN my_property_values.FIRST .. my_property_values.LAST Loop
            IF my_property_values(k) <> 'AUThenTICATED_USERS' AND my_property_values(k) <> 'OracleDASCreateGroup' Then  
         Htp.p(my_property_values(k) || '<br>');
   End IF;
        End Loop;
  else
        Htp.p('my_property_values vide');   
     End IF;
   End Loop;
 Else
     Htp.p('my_pset_coll vide');
 End IF;
 
 
 -- 4ème colonne : affiche le membership sur tous les niveaux (récursif)
 Htp.p('<td>');
 
 -- Get Group Membership SUR 1 NIVEAU
 my_attrs.DELETE();
 my_attrs(1) := 'cn';
 retval := DBMS_LDAP_UTL.get_group_membership ( my_session,
                                user_handle,
                                DBMS_LDAP_UTL.NESTED_MEMBERSHIP,
                                my_attrs,
                                my_pset_coll );
 IF retval != DBMS_LDAP_UTL.SUCCESS  Then
      Htp.p(''); --    Htp.p('get_group_membership returns : ' || to_char(retval));
 End IF;
 IF my_pset_coll.COUNT > 0 Then
   FOR i IN my_pset_coll.FIRST .. my_pset_coll.LAST Loop 
     retval := dbms_ldap_utl.get_property_values (my_pset_coll (i),my_attrs (1), my_property_values);
     IF my_property_values.COUNT > 0 Then  
        FOR k IN my_property_values.FIRST .. my_property_values.LAST Loop
            IF my_property_values(k) <> 'AUThenTICATED_USERS' AND my_property_values(k) <> 'OracleDASCreateGroup' Then  
         Htp.p(my_property_values(k) || '<br>');
   End IF;
        End Loop;
  else
        Htp.p('my_property_values vide');   
     End IF;
   End Loop;
 Else
     Htp.p('my_pset_coll vide');
 End IF;
 
 Htp.p('</td></tr></table></font>');
 -- Free handle
 DBMS_LDAP_UTL.free_handle(subscriber_handle);
 DBMS_LDAP_UTL.free_handle(user_handle);
 DBMS_LDAP_UTL.free_handle(group_handle);
  -- unbind from the directory 
 retval := disconnect_from_oid(my_session);
 
 
-- Handle Exceptions
 EXCEPTION
  WHEN OTHERS Then
   Htp.p(' Error code    : ' || TO_CHAR(SQLCODE));
   Htp.p(' Error Message : ' || SQLERRM);
   Htp.p(' Exception encountered .. exiting');
 
 
End GET_OID_GROUP_MEMBERSHIP;
/
Loko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 10h09   #2
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 534
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 534
Points : 6 471
Points : 6 471
Interressant

Voici une requête qui indique également à quels groupes appartient un utilisateur du portail:

Code :
1
2
3
4
SELECT ID, NAME, dn FROM WWSEC_GROUP$ WHERE ID IN 
(SELECT group_id FROM WWSEC_FLAT$ WHERE person_id = 
 (SELECT ID FROM WWSEC_PERSON$ WHERE user_name =UPPER('prenom.nom'))
);
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 10h18   #3
Membre habitué
 
Inscription : juillet 2004
Messages : 254
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juillet 2004
Messages : 254
Points : 114
Points : 114
Bonjour

Sauf erreur de ma part, cette requête n'est pas récursive (?).

De plus il faut éviter désormais d'utiliser les infos qui sont dans le schéma Portal, surtout depuis la version 10g car il est clairement indiqué dans la doc que les données et certaines fonctions "oid" de ce schéma sont "deprecated".

A+
Loko
Loko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 11h32   #4
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 534
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 534
Points : 6 471
Points : 6 471
Oui, elle n'est pas récursive, mais cela peut être fait dans une procédure PL/SQL
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2008, 11h17   #5
Membre habitué
 
Inscription : juillet 2004
Messages : 254
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juillet 2004
Messages : 254
Points : 114
Points : 114
Citation:
Envoyé par SheikYerbouti Voir le message
Oui, elle n'est pas récursive, mais cela peut être fait dans une procédure PL/SQL
Effectivement. Mais il faudrait lui passer aussi un tableau des cas déja traités afin d'éviter les boucles infinies, etc ...

Je trouve cela plus propre d'utiliser les fonctions fournies par l'API ;-)

Bonne semaine
Loko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2008, 11h43   #6
Rédacteur

 
Avatar de SheikYerbouti
 
Inscription : mai 2003
Messages : 6 534
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 6 534
Points : 6 471
Points : 6 471
Citation:
Envoyé par Loko Voir le message
Je trouve cela plus propre d'utiliser les fonctions fournies par l'API ;-)
c'est clair
__________________
Rédacteur Oracle (Oracle ACE)
Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
Je ne réponds pas aux questions techniques par MP
Blogs: Forms-PL/SQL-J2EE - Forms Java Beans
SheikYerbouti est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h46.


 
 
 
 
Partenaires

Hébergement Web