PHP a autentizace proti Active Directory

06.06.2011
// ============================================================================================
// Trida pro autorizaci proti AD 
// ============================================================================================

class ad_auth {

  // implicitni nastaveni 
  var $ldap_server = "192.168.1.10";
  var $error_messages = array();
  var $domain = "mojedomena.cz";
  var $ldap_user_jmeno = "";
  var $ldap_user_dn = "";
  var $ldap_user_username = "";
  var $ldap_user_ingroups = array();
  var $ldap_search_root = "DC=mojedomena,DC=cz";
  
  
  // ------------------------------------------------------------------------------------------
  // metoda na provedeni autorizace proti LDAP serveru
  // ------------------------------------------------------------------------------------------
  function auth($username, $password, $agroups=none) {

    // uprava uzivatelskeho jmena a hesla
    $username = preg_replace("/.*\\\/", "", $username);
    $username = preg_replace("/@.*/", "", $username);
    $username = $this->mrpropper($username);
    $password = $this->mrpropper($password);

    // vytvoreni spojeni k LDAP serveru
    $ldap_connection = ldap_connect($this->ldap_server);
    if(!$ldap_connection) {
      array_push($this->error_messages, "Připojení k $this->ldap_server je nedostupné");
      return false;
    } 

    // nastaveni parametru pro komunikaci s MSAD
    @ldap_set_option($ldap_connection, LDAP_OPT_PROTOCOL_VERSION, 3);  // AD podporuje LDAPv3
    @ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, 0);         // pro AD vyp referrals

    // autentizace
    $res = @ldap_bind($ldap_connection, "$username@$this->domain", $password);
    if( ($res === false) || (strlen($username)<1) ) {
      array_push($this->error_messages, "chybné uživatelské jméno nebo heslo");
      @ldap_close($ldap_connection); 
      return false; 
    } 
    
    // vyhledani uzivatele v LDAP, vystup do pole entries
    $rec = ldap_search($ldap_connection, $this->ldap_search_root, "samaccountname=$username"); 
    $entries = ldap_get_entries($ldap_connection, $rec);
    
    // zjisteni jmena uzivatele
    $this->ldap_user_jmeno = iconv('utf8', 'cp1250' . '//IGNORE', $entries[0][displayname][0]);
    
    // zjisteni DN
    $this->ldap_user_dn = iconv('utf8','cp1250'.'//IGNORE', $entries[0][distinguishedname][0]);
    
    // zjisteni skupin do kterych uzivatel patri
    $amemberof = $entries[0][memberof];
    if( is_array($amemberof) ) {
      unset($amemberof[count]);
      foreach ($amemberof as $skupina) {
        $skupina = iconv('utf8', 'cp1250' . '//IGNORE', $skupina);
        $skupina = eregi_replace ( ",.*" , "" , $skupina);
        $skupina = eregi_replace ( ".*=" , "" , $skupina );
        array_push($this->ldap_user_ingroups, $skupina);
      }   
    }
    
    // overovani clenstvi ve skupine (skupinach)
    $retval = true;
    if( is_array($agroups) ) {
      foreach ($agroups as $skupina) {
        if( !in_array($skupina, $this->ldap_user_ingroups) ) {
          array_push($this->error_messages, "uživatel není členem $skupina");
          $retval = false;
        } 
      }
    }
    
    // odpojeni od LDAP serveru
    @ldap_close($ldap_connection);
    $this->ldap_user_username = $username; 
    return($retval);
  
  }
  // ------------------------------------------------------------------------------------------



  // ------------------------------------------------------------------------------------------
  // metoda na odstraneni nepeknych znaku z pripadneho formulare
  // ------------------------------------------------------------------------------------------
  function mrpropper($data) {
    $string = strip_tags($data);
    $string = stripslashes($string);
    $string = str_replace("'", "\'", $string);
    $string = str_replace('"', '\"', $string);
    return($string);  
  }
  // ------------------------------------------------------------------------------------------
  
  
}


// nastaveni komunikace s LDAP 
$ad = new ad_auth();
$ad->ldap_server = "192.168.100.1";
$ad->domain = "mamot.net";
  
// provedeni autentizace
if ( !$ad->auth($uzivatel, $heslo) ) {
  echo "Nenalezen uživatel s těmito přihlašovacími údaji.";
}