Immaginiamo di avere un server Windows con dominio chiamato torregatti.local. Possiamo effettuare l’autenticazione tramite PHP utilizzando il metodo LDAP (Lightweight Directory Access Protocol).
Anzitutto assicuriamoci di avere attiva la libreria LDAP all’interno del PHP.
Su Linux possiamo installare la libreria, per esempio con Ubuntu digitiamo:
1 |
apt-get install php-ldap |
Mentre su Windows, per esempio usando XAMPP, sarà sufficiente attivare l’estensione nel file php.ini, rimuovendo il commento alla seguente riga:
1 |
;extension=php_ldap.dll |
Che diventerà quindi:
1 |
extension=php_ldap.dll |
Fatto questo possiamo creare una classe che si occupi del processo di login.
Prima di procedere vediamo il minimo indispensabile per effettuare il processo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$conn = ldap_connect("ldap://192.168.56.1", 389 ); if( $conn ) { ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($conn, LDAP_OPT_REFERRALS, 0); $bind = @ldap_bind($conn, "TORREGATTI\\ADMINISTRATOR", "Password123"); if( $bind ) { ldap_close( $conn ); echo "connesso!"; } else { die("Errore autenticazione"); } } else { die("Errore di connessione"); } |
In questo caso stiamo entrando con l’utente amministratore TORREGATTI\ADMINISTRATOR
che ha per password Password123
Ricordiamoci che nel nostro esempio il dominio è torregatti.local
e il server si trova sull’indirizzo 192.168.56.1
. Ci stiamo collegando con una connessione non sicura, usando il protocollo ldap anziché ldaps (richiederebbe la porta 636).
Possiamo creare una classe che effettui tutto il processo di login e ci permetta di verificare l’autenticazione mediante i cookie, nella maniera seguente:
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 |
class LDAPLogin { private $server; private $username; private $password; private $ssl; private $key; const ERR_NO_ERROR = 0x0; const ERR_CONNECTION = 0x1; const ERR_PROTOCOL = 0x2; const ERR_REFERRALS = 0x3; const ERR_SERVER = 0x4; const ERR_USERNAME = 0x5; const ERR_AUTH = 0x6; const ERR_KEY = 0x7; private $status = 0x0; private $cookie_username = "ldap_username"; private $cookie_hash = "ldap_hash"; private $cookie_expire = 30; function __construct( $server = NULL, $user = NULL, $pass = NULL , $ssl = false , $key = null ) { $this->setServer( $server ); $this->setUsername( $user ); $this->setPassword( $pass ); $this->setSSL( $ssl ); $this->setKey( $key ); } function setCookies( $username , $hash , $expire ) { $this->cookie_username = $username; $this->cookie_hash = $hash; $this->cookie_expire = $expire; } function setServer( $server ) { $this->server = $server; return $this; } function setUsername( $username ) { $this->username = $username; return $this; } function setPassword( $password ) { $this->password = $password; return $this; } function setSSL( $ssl = true ) { $this->ssl = $ssl; return $this; } function setKey( $key ) { $this->key = $key; return $this; } function authenticate() { if( !$this->server ) $this->status = self::ERR_SERVER; if( !$this->username ) $this->status = self::ERR_USERNAME; if( !$this->key ) $this->status = self::ERR_KEY; if( $this->status == self::ERR_NO_ERROR ) { $connString = ($this->ssl?"ldaps":"ldap") . "://" . $this->server; $connPort = $this->ssl ? 636 : 389; $conn = ldap_connect( $connString , $connPort ); if( $conn ) { ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3) or $this->status = self::ERR_PROTOCOL; ldap_set_option($conn, LDAP_OPT_REFERRALS, 0) or $this->status = self::ERR_REFERRALS; if( $this->status == self::ERR_NO_ERROR ) { $bind = @ldap_bind($conn, $this->username, $this->password); if( $bind ) { ldap_close( $conn ); setcookie( $this->cookie_username , $this->username , time() + 3600 * 24 * $this->cookie_expire ); setcookie( $this->cookie_hash , hash("sha512",$this->username . $this->key) , time() + 3600 * 24 * $this->cookie_expire ); } else { $this->status = self::ERR_AUTH; } } } else { $this->status = self::ERR_CONNECTION; } } return $this; } function getError() { return $this->status; } function isAuth() { return $_COOKIE[$this->cookie_hash] == hash("sha512",$_COOKIE[$this->cookie_username] . $this->key); } function logout() { setcookie( $this->cookie_username , NULL , 0 ); setcookie( $this->cookie_hash , NULL , 0 ); return $this; } } |
Per effettuare il login sarà sufficiente configurare la classe nella maniera seguente:
1 2 3 4 5 6 |
$ldap = (new LDAPLogin( "192.168.56.1" , "TORREGATTI\\ADMINISTRATOR" , "Password123" )) ->setKey("0bb74b7aa9cadf13d2c05332744ebc8ee5b09ef9a53cb67ea0b3adabde4f598b"); if( $ldap->authenticate()->getError() == LDAPLogin::ERR_NO_ERROR ) { // autenticazione avvenuta } |
Abbiamo aggiunto una nostra chiave casuale e segreta che verrà utilizzata per la costruzione del hash nei cookie.
Per verificare che l’utente sia autenticato, una volta terminato il processo di login, sarà sufficiente richiamare:
1 2 3 |
if( $ldap->isAuth() ) { // ok, utente autenticato } |
Per effettuare il logout sarà sufficiente richiamare:
1 |
$ldap->logout(); |
E’ molto probabile che l’inserimento di username e password lo si voglia fare dopo aver costruito l’oggetto per l’autenticazione LDAP, in tal caso si potrebbe procedere nella maniera seguente:
1 2 3 4 5 6 7 |
$ldap = (new LDAPLogin("192.168.56.1"))->setKey("0bb74b7aa9cadf13d2c05332744ebc8ee5b09ef9a53cb67ea0b3adabde4f598b"); $ldap->setUsername( "TORREGATTI\\ADMINISTRATOR" )->setPassword( "Password123" ); if( $ldap->authenticate()->getError() == LDAPLogin::ERR_NO_ERROR ) { echo "autenticazione avvenuta!"; } |
Con il metodo getError()
è possibile verificare gli altri eventuali errori durante il processo di autenticazione, sfruttando le costanti della classe.