ldapAan de slag met LDAP


Opmerkingen

Deze sectie geeft een overzicht van wat LDAP is en waarom een ontwikkelaar het zou willen gebruiken.

Het moet ook alle grote onderwerpen binnen LDAP vermelden en een link naar de gerelateerde onderwerpen bevatten. Aangezien de documentatie voor ldap nieuw is, moet u mogelijk eerste versies van die gerelateerde onderwerpen maken.

PHP instellen om te werken met LDAP

Nadat u uw LDAP-server correct hebt geconfigureerd, willen we nu verbinding maken. Bijvoorbeeld door PHP te gebruiken.

  • DN = DN-naam. Dit betekent in welk deel van de database u werkt. Kan een gebruiker of een groep zijn (of zelfs configuratie-instellingen).
  • Vermelding: een entiteit, bijvoorbeeld een gebruiker.
  • Attribuut: iets in een invoer, bijvoorbeeld naam, telefoonnummer en e-mailadres.

Verbinden

Eerst definiëren we het volgende:

$server = "server.example.com";  //this is the LDAP server you're connecting with
$ds = ldap_connect("ldaps://$server", 636); //always connect securely via LDAPS when possible
 

Nu zijn we verbonden. Het volgende dat we willen, is de server laten weten dat we een betrouwbaar persoon zijn. De eenvoudigste oplossing is om de root DN te gebruiken OF een bestaande gebruiker met de juiste machtigingen om de database te bekijken (waarschijnlijk kan elke gebruiker in de database dit standaard doen). We authenticeren met behulp van de bind-functie.

Opties instellen

Eerst verklaren we deze opties. Afhankelijk van uw serverconfiguratie kunt u dit weglaten.

ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
 

Verbindend

Stel dat u admin gebruikt en het wachtwoord is pass123notsafe

$dn = "uid=admin,cn=users,dc=server,dc=example,dc=com";
$pass = "pass123notsafe";
$ldapbind = ldap_bind($ds, $dn, $pass); //this is the point we are authenticating
 

Dat is erg leuk. We zijn binnen. Nu kunnen we veel verschillende bewerkingen uitvoeren. We kunnen bijvoorbeeld gebruikers en zelfs groepen zoeken, lezen, schrijven en wijzigen.

Zoeken

Stel je voor dat we alle leden van de groep 'gebruikers' willen weergeven.

$dn = "cn=users,dc=server,dc=example,dc=com"; //very important: in which part of your database are you looking
$filter = "uid=*"; //don't filter anyone out (every user has a uid)
$sr = ldap_search($ds, $dn, $filter) or die ("bummer"); //define your search scope

$results = ldap_get_entries($ds, $sr); //here we are pulling the actual entries from the search we just defined
var_dump($results); //will give you all results is array form. 
 

U kunt foreach-lussen gebruiken om de gegevens op een leuke manier weer te geven.

Oké, heb je dit? Ga nu verder met wat filteren. We willen alleen gebruikers in de groep "fietsbezitters" weergeven die een e-mailadres hebben geregistreerd. Het is belangrijk om te weten dat alle gebruikers zich in cn = users bevinden. Daarnaast kunnen ze ook lid zijn van andere groepen.

//did the connecting and binding

$dn = "cn=bikeowners,cn=groups,dc=server,dc=example,dc=com"; //note the extra "cn=groups" for looking in a group that is not "users"
$filter = "email=*"; //email address must be set but can be anything
$sr = ldap_search($ds, $dn, $filter) or die ("bummer"); //define your search scope
 

En ga nu weer verder met ldap_get_entries .

Efficiëntie bij het ontvangen van vermeldingen

Een voorbeeld waarin efficiëntie wordt aangepakt, steeds belangrijker bij grote databases met veel attributen per invoer. Vooral wanneer u afbeeldingen opslaat in het kenmerk jpegphoto, kan dit uw laadtijd aanzienlijk verkorten wanneer u uw invoer selectief trekt.

Stel je voor dat we gebruikers willen zoeken die in de groep "fietsbezitters" vallen. Er is veel informatie opgeslagen in deze vermeldingen, laten we zeggen dat ze de volgende kenmerken hebben: cn, uid, naam, weergavenaam, e-mail, initialen, mobiel, telefoonnummer, straat, postadres, postcode en jpegphoto. Nu hebben we alleen hun uid, naam en initialen nodig.

Hiervoor gebruiken we een optionele 4e parameter van ldap_search:

$dn = "cn=bikeowners,cn=groups,dc=server,dc=example,dc=com";
$filter = "uid=*"; //
$justhese = array("uid", "name", "initials");
$sr = ldap_search($ds, $dn, $filter, $justthese) or die ("bummer"); //define your search scope
 

En voila, met ldap_get_entries krijg je alleen deze gegevens.

Geavanceerde filtering

Natuurlijk kunt u een hele database ophalen met LDAP en dit verder verwerken in PHP. Net als bij MySQL is het echter veel efficiënter om de server te verwerken. Om dit aan te tonen, kunnen we een geavanceerd filter gebruiken.

Neem een van de bovenstaande voorbeelden als beginpunt, maar wijzig $ filter volgens de onderstaande regel. In ons voorbeeld willen we de gegevens weergeven van gebruikers die actief zijn. Normaal gesproken wordt het kenmerk shadowexpire gebruikt om deze informatie op te slaan. Dit kan echter verschillen tussen verschillende LDAP-systemen. We willen niet alleen de actieve gebruikers weergeven, maar ook hun naam moet beginnen met een "a" en ze moeten in Amsterdam wonen.

In principe willen we drie dingen doen:

  1. Makkelijkst: moet in Amsterdam wonen. In dit voorbeeld wordt de woonplaats opgeslagen in attribuut 'postadres'
$filter= "postaladdress=Amsterdam";
 
  1. Naam moet beginnen met een "a". In dit voorbeeld is UID samengesteld uit de naam, dus:
$filter= "uid=a*";
 
  1. Gebruiker moet actief zijn. Deze waarde wordt opgeslagen in het standaardkenmerk shadowexpire , met waarde -1 . Afhankelijk van uw serverconfiguratie kan shadowexpire een groot aantal waarden bevatten, zelfs datums zijn mogelijk. Als een gebruiker inactief is, is shadowexpire 1 . Om zeker te zijn dat we alle gebruikers krijgen, behalve degenen die echt inactief zijn, kiezen we er niet voor om te filteren op shadowexpire = -1 . In plaats daarvan zeggen we dat we niet willen dat ze inactief zijn.
$filter= "(!(shadowexpire=1))"; //NOT is represented with "!"
 

Nu het meest interessante deel: combineer alle drie de voorbeelden. We kunnen dit doen met haakjes, EN, OF en NIET uitdrukkingen

$filter= "(&(postaladdress=Amsterdam)(uid=a*)(!(shadowexpire=1)))";
 

Ten slotte kunnen we een OR-instructie inbouwen met "|", bijvoorbeeld als we willen dat alle gebruikers beginnen met "a" of "b"

$filter= "(|(uid=a*)(uid=n*))";
 

Je kunt eindeloos combineren en behoorlijk indrukwekkende filters bouwen, veel plezier met proberen!