Ik snap volkomen wat je bedoeld. Voordat ik je ga uitleggen hoe het allemaal werkt even een vraag. Is het niet veel mooier als je een Single Sign On creëert? Ik heb dit zelf nog nooit gedaan, maar ik weet dat dit met het Kerberos protocol kan. Heb ik altijd al in willen duiken, maar ik heb zo weinig tijd ;-)
Terugkomend op jouw vraag, heel even de werkwijze neergezet:
1: Het authenticeren van een gebruiker.
2: Controleren of de gebruiker een de juiste groep zit.
Het authenticeren van een gebruiker:
Ik heb wat opmerkingen op de manier hoe jij een gebruiker in laat loggen.
Ik mis de (juiste) foutafhandeling van diversen onderdelen en ik mis de instelling van de versie van LDAP. Wanneer je eventueel de authenticatie over SSL wilt laten verlopen moet je gebruik maken van LDAP versie 3.
Marco heeft je reeds een link gestuurd naar de reeks met artikelen over Active Directory en PHP.
In het 5e artikel wordt uitgelegd hoe je op de juiste manier een gebruiker kunt authenticeren. In het 4e artikel wordt uitgelegd hoe je precies de versie van LDAP instelt.
Controleren of de gebruiker een de juiste groep zit:
Dit wordt een wat lastiger punt (phoe). Ik heb iets gemaakt, en ik denk het doet wat jij wil. Ik heb op dit moment niet de mogelijkheid om het (goed) te testen, dus dat moet je zelf even doen :-)
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (isset($_POST['username']) && isset($_POST['password'])) {
$dn = 'OFFICE\\';
$connection = ldap_connect('172.16.10.4', 389);
if ($entries[0]['count'] > 0) {
// Active Directory retourneert niet de primary groep.
// Ik neem aan dat je die wilt hebben
if (isset($entries[0]['primarygroupid'][0]) && isset($entries[0]['objectsid'][0])) {
$userId = $entries[0]['objectsid'][0];
$groupId = $entries[0]['primarygroupid'][0];
$id = substr_replace($userId, pack('V', $groupId), strlen($userId)-4, 4);
// ID is nu binair. ldap_search kan daar niet mee omgaan, dus 'even' converteren
$hexId = bin2hex($id);
$count = hexdec(substr($hexId, 2, 2));
$result = hexdec(substr($hexId, 0, 2)) - hexdec(substr($hexId, 4, 12));
for ($i = 0; $i < $count; $i++) {
// Conversie little-endian hex naar normale hex (anders kan hexdec er niet mee omgaan)
$conv = '';
for ($x = strlen(substr($hexId, 16 + ($i * 8), 8)) - 2; $x >= 0; $x = $x -2) {
$conv .= substr(substr($hexId, 16 + ($i * 8), 8), $x, 2);
}
// Samensmelten
$subs = array();
$subs[$i] = hexdec($conv);
$result .= '-'.$subs[$i];
}
Ik ben benieuwd of je een beetje snapt wat er allemaal gebeurd. Je moet wel zelf even de foutafhandeling toevoegen. Als ik dat allemaal had gedaan was het script wel een stukje langer :-)
De uitdaging voor mij is de groepen nog recursief in de array pompen. Ik zal eens kijken of ik dat voor elkaar krijg.
Ja is inmiddels gelukt. Ik heb een collega erbij geroepen en we hebben wel een ander script samengesteld zonder fout opvanging. Maar omdat het voor een simpel systeem is is het niet zo erg.
[size=xsmall]Toevoeging op 22/03/2012 14:48:54:[/size]
Maar zit ik weer met het volgende probleem :( ik vind ldap toch niet zo leuk meer.. XD Ik moet nog een lijst hebben van alle users van de AD die in een dropdown box komt. Misschien ideeen?
Op deze manier kan het ook. Alleen kijkt hij op dit moment niet naar subs.
Stel je hebt de volgende mappenstructuur:
- Hoofdmap
- Submap
Nu wil je weten of je user in de groep Submap zit. Naar mijn weten controleert jouw script dat niet.
Daarnaast, moet jij een hele LDAP search string invoeren: 'CN=shared_resources,OU=Access Control Groups,DC=xxx,DC=xx,DC=xx'. Met mijn script hoef je alleen de naam in te voeren.