2016-07-14 20 views
3

Ich habe das folgende Skript, das den AD-Zugriff überprüft und dann auch innerhalb einer bestimmten Gruppe die Mitgliedschaft überprüft.Zeigen Sie alle Active Directory-Gruppen an, bei denen ein Benutzer rekursiv ist.

Wie kann ich jede einzelne Gruppe anzeigen, auf die ein Benutzer Zugriff hat, einschließlich nicht direkter - zum Beispiel - user - userA, in group - groupA und auch groupA in in groupB, ich möchte groupB als anzeigen gut als groupA

Was vermisse ich?

<?php 
     //ini_set('display_errors', 1); 
     session_start(); 
     //ini_set('display_startup_errors', 1); 
     //error_reporting(E_ALL); 
//  require_once('assets/config.php'); 

     $ldap_server = "ldap*************************"; 


if(isset($_SESSION['itssd_user'])) { 
    $submittedusername = $_SESSION['itssd_user']; 
} 
if(isset($_SESSION['itssd_pw'])) { 
    $submittedpassword = $_SESSION['itssd_pw']; 
} 


     //$ro_access_group='CN=****,OU=Service Desk,OU=Customer Services,OU=ITS,OU=Groups,DC=registry,DC=otago,DC=ac,DC=nz'; 
     $ro_access_group='DC=registry,DC=otago,DC=ac,DC=nz'; 
     // Connect to the LDAP server 
     $ldap = ldap_connect($ldap_server); 

function inGroup($ldapConnection, $userDN, $groupToFind) { 
    $filter = "(memberof:1.2.840.113556.1.4.1941:=".$groupToFind.")"; 
    $search = ldap_search($ldapConnection, $userDN, $filter, array("dn"), 1); 

    $items = ldap_get_entries($ldapConnection, $search); 
    echo "<pre>"; 
     echo var_dump($items)."<br>"; 
    echo "</pre>"; 
    if(!isset($items["count"])) { 
     return false; 
    } 
    return (bool)$items["count"]; 
} 
     if ($ldap) { 
       // Connect to the database for querying. 
//    $dbConn = connectDB(); 
       //$dn = "cn=" . $submittedusername . ",ou=Users,ou=Otago,dc=registry,dc=otago,dc=ac,dc=nz"; 

       $dn = "registry\\".$submittedusername; 

       $basedn = "dc=registry,dc=otago,dc=ac,dc=nz"; 
       if (($submittedpassword == "") OR ($submittedpassword == NULL)) { 
         $loginResult = 'INVALIDUSER'; 
       } else { 
         // Now attempt to bind 
         if (ldap_bind($ldap, $dn, $submittedpassword)) { 
           $search_user=ldap_search($ldap, $basedn, "(sAMAccountName=".$submittedusername.")"); 
           if($search_user){ 
           echo 'Authenticated'; 
           } 

           $user_details=ldap_get_entries($ldap, $search_user); 
           //$ro_name=$user_details[0]["displayname"][0]; 
           if(!$user_details){ 
             $loginResult = "INVALIDUSER"; 
             echo 'null user details<br>'.sizeof($user_details); 
           } 
           else{ 
             //echo "<pre>"; 
              //echo var_dump($user_details[0])."<br>"; 
             //echo "</pre>"; 

             if(isset($user_details[0]["memberof"][0])) { 
             $groupCount = $user_details[0]["memberof"]["count"] - 1; 
             for ($i = 0; $i <= $groupCount; $i++) { 
              echo $user_details[0]["memberof"][$i]; 
              echo "<br>"; 
             } 
            } 
             $_SESSION['itssd_email_messages_count'] = 0; 
             $_SESSION['itssd_notifications_count'] = 0; 
             $_SESSION['itssd_username'] = $submittedusername; 
             $_SESSION['itssd_date_view'] = date('Y-m-d', time()); 
             $_SESSION['itssd_prod'] = FALSE; 
             if (inGroup($ldap, $user_details[0]["dn"], $ro_access_group)) { 
               $loginResult = "Authorised"; 
             } else { 
               //echo "<br/><br/><br/>".$submittedusername." not in group ".$ro_access_group; 
               //echo "<br/>".$user_details[0]["memberof"]; 
               //echo var_dump($user_details[0]["memberof"]); 
               //echo "<br/><br/>"; 
               echo inGroup($ldap, $user_details[0]["dn"], $ro_access_group); 
               $loginResult = "INVALIDUSER"; 
             } 
           } 
         } else { 
           $loginResult = 'INVALIDUSER'; 
         } 
         $submittedpassword = NULL; 
       } 
       echo $loginResult; 

     } 
?> 

Antwort

1

In Ihrer inGroup Verfahren der Verwendung dieses für die Filter statt:

$filter = "(&(distinguishedName=$groupToFind)(member:1.2.840.113556.1.4.1941:=$userDN))";

Die die Gruppe von DN wählen Sie zuerst dann überprüfen, um zu sehen, ob es ein Element rekursiv durch seinen DN enthält.

bearbeiten

Wenn Sie die Suche alle Gruppen zurück der Benutzer ein Mitglied der Verwendung ist dieser Filter:

$filter = "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=$userDN))";

wie:

$filter = "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=$userDN))"; 
$search = ldap_search($ldapConnection, 'DC=registry,DC=otago,DC=ac,DC=nz', $filter, array("cn")); 

$allGroups = ldap_get_entries($ldapConnection, $search); 

Die $allGroups oben wird Container jeder Gruppe ein Benutzer ist entweder direkt oder Mitglied indirekt (z. B. eine Gruppe, die Mitglied einer anderen Gruppe ist, usw.). Ist jedoch DC=registry,DC=otago,DC=ac,DC=nz wirklich das "Basis" -Niveau Ihrer Domain? Das sollte das zweite Argument für ldap_search sein.

+0

Danke dafür, also, indem ich die geänderte $ filter-Variable verwende, wie zeige ich jedes und jede Gruppe an, die miteinander verbunden sind? –

+0

Ich aktualisierte es, um einen Filter einzuschließen, der auch alle Gruppen zurückgeben könnte, die der Benutzer ist, wenn er mit 'ldap_search' verwendet wird. – ChadSikorra

+0

Beifall - OK ich den Code geändert, um die membersOf Eigenschaft eines bestimmten Benutzers 'if (isset ($ user_details [0] [ "memberof"] [0])) { \t \t \t \t \t \t \t \t \t \t \t showe $ groupCount = $ user_details [0] ["memberof"] ["Anzahl"] - 1; \t \t \t \t \t \t \t \t \t \t \t for ($ i = 0; $ i <= $ Groupcount; $ i ++) { \t \t \t \t \t \t \t \t \t \t \t \t echo user_details $ [0] [ "memberof"] [$ i]; \t \t \t \t \t \t \t \t \t \t \t \t echo "
"; \t \t \t \t \t \t \t \t \t \t \t} \t \t \t \t \t \t \t \t \t \t} 'Wie kann ich jeder verwenden und dann recoursively überprüfen, welche Gruppen, die diese sind in? –