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

SQL Oracle Discussion :

[PORTAL][TIP] Retrouver tous les groupes d'un utilisateur


Sujet :

SQL Oracle

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    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 : 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
    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;
    /

  2. #2
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Interressant

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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'))
    );

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut
    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

  4. #4
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Oui, elle n'est pas récursive, mais cela peut être fait dans une procédure PL/SQL

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Par défaut
    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

  6. #6
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Citation Envoyé par Loko Voir le message
    Je trouve cela plus propre d'utiliser les fonctions fournies par l'API ;-)
    c'est clair

Discussions similaires

  1. [XL-2003] Evènement si tous les groupes de radio boutons sont cliqués
    Par pomdeterfrite dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/04/2011, 13h49
  2. [ActiveDirectory] Lister tous les groupes
    Par RaelRiaK dans le forum VB.NET
    Réponses: 5
    Dernier message: 15/02/2007, 17h31
  3. Tree Control develloper tous les groupes
    Par beb30 dans le forum MFC
    Réponses: 2
    Dernier message: 18/08/2006, 18h05
  4. Réponses: 2
    Dernier message: 26/04/2006, 09h34
  5. Retrouver tous les champs d'une table
    Par tripper.dim dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/07/2004, 20h40

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