Facebook
Twitter
Google+
Kommentare
3

Active Directory als Authentifizierungsmechanismus und Modul Factory

Active Directory als Authentifizierungsmechanismus und Modul Factory

Immer wieder kommt es vor das Unternehmensinterne Anwendungen  über Intranet  dem gesamten Unternehmen zur Verfügung gestellt werden sollen. Solche Anwendungen bestehen in der Regel aus Modulen die nicht für alle Anwender zugänglich gemacht werden dürfen und daher ist eine Authentifizierung  der Anwender zwingend.

Eine Möglichkeit ist es für diese Authentifizierung  das in vielen Unternehmen vorhanden Aktive Directory (AD) zu  nutzen, und die Anwendung durch die Gruppenrichtlinie modular aufzubauen. Damit entfällt das implementieren einer eigenen Anwendungsspezifischen Benutzerverwaltung.

Um das Aktive Directory zu nutzen muss die LDAP Unterstützung aktiviert sein. Unter Linux muss PHP daher mit Konfigurationsoption

–width-ldap<pfad zum >

Übersetzt werden unter Windows muss in der php.ini

extension=php_ldap.dll

eingeschaltet werden.

Wenn der Apache richtig konfiguriert ist steht nach der Anmeldung via  SSL in der

$_SERVER[‘AUTHENTICATE_SAMACCOUNTNAME‘];

der Benutzername zur Verfügung.

Durch das richtige benennen der AD Gruppen kann nun relativ einfach eine Modulare Struktur der Anwendung implementiert werden.

AD Gruppe

– pplikationen

  • adminApplikation1
  • userApplikation1
  • adminApplikation2
  • userApplikation2
  • usw…

Ordnerstruktur der PHP Anwendung

– Controller

  • adminAppliaktion1
    • adminApplikation1_startController
    • adminApplikation1_siteEditController

Nach dem Connect  und dem Binding  (Listing 1) können nun die Gruppen des Users abgefragt werden (Listing 2), Um sich viele Require Anweisungen zu sparen wird eine __autoload Funktion implementiert (Listing 3). Über einen Wrapper wird nun ermittelt ob es für einen Benutzer mögliche Module gibt für die dieser freigeschaltet ist (Listing 4).

Durch diese Konstruktion ist es nun möglich auf einfach Art und Weise eine Anwendung so zu steuern das die Benutzer der einzelnen Fachabteilung die Applikationen nutzen können für die diese Freigeschaltet sind.

Wenn Benutzer nur einer Applikation zugewiesen sind, kann direkt in diese gesprungen werden, andererseits kann ein Auswahlmenu generiert werden in dem eine Auswahl der zur Verfügung stehenden Applikation dem Benutzer zur Auswahl angeboten werden kann (Listing 5).

Listing 1.

class ldapconnect{

public $ldapconn=false;

/**
* @return the $ldapconn
*/

public function getLdapconn() {
  return $this->ldapconn;
}

/**
 * @param $ldapconn the $ldapconn to set
 */

private function setLdapconn($ldapconn) {
  $this->ldapconn = $ldapconn;
}

public function __construct(){
  $this->ldapconn= ldap_connect ( LDAPSERVER,LDAPPORT ) or die ( "Keine Verbindung zu ".LDAPSERVER." möglich" );
  $this->ldapbind();
}

private function ldapbind(){
  ldap_bind ( $this->ldapconn , 'cn=location,OU=####,OU=####,OU=######,DC=#####,DC=###', '#password' ) or die ( "!Keine Verbindung zu ". LDAPSERVER." möglich" );
}

}

Listing 2

<?php

class ldapgruppen extends ldapconnect
{
private $gruppen=false;

public function __construct()
{
  parent::__construct ();
}

private function setGruppen($gruppen)
{
  $this->gruppen [] = $gruppen;
}

public function getGruppen(){
  return $this->gruppen;
}

public function getLdpaGruppeByMember(){
  $dn = "OU=####,DC=####,DC=###";
  $justthese = array ("memberof" );
  $filter = '(samaccountname=' . strtolower ( $_SERVER ['AUTHENTICATE_SAMACCOUNTNAME'] ) . ')';
  $sr = ldap_search ( $this->getLdapconn (), $dn, $filter, $justthese ) or die ( ldap_error () );
  $info = ldap_get_entries ( $this->getLdapconn (), $sr );
  foreach ( $info [0] ['memberof'] as $key => $line )
  {
    if (is_numeric ( $key ))
    {
      $g = explode ( ',', $line );
      $this->setGruppen ( substr ( $g [0], 3 ) );
    }
  }
}

}

Listing 3


/*
* Klassenname class.<classname>.php
*/

function __autoload($name)
{
  if (strpos ( $name, '_' ) === False)
  {
    $file = 'class.' . $name . '.php';
    if (is_file ( CONTROLLERPATH . $file ))
    {
      require_once CONTROLLERPATH . $file;
    }
    elseif (is_file ( MODELPATH . $file ))
    {
      require_once MODELPATH . $file;
    }
    elseif (is_file ( VIEWPATH . $file ))
    {
      require_once VIEWPATH . $file;
    }
    elseif (is_file ( EXE . $class ))
    {
      require_once EXEPTIONPATH . $class;
    }
    else
    {
      $dir = substr ( $name, 0, - 10 );
      if (is_dir ( CONTROLLERPATH . $dir ))
      {
        if (is_file ( CONTROLLERPATH . $dir . '/class.' . $name . '.php' ))
        {
          require_once CONTROLLERPATH . $dir . '/class.' . $name . '.php';
        }
      }
    }
  }
  else
  {
    list ( $dir, $class ) = explode ( '_', $name );
    if (is_dir ( CONTROLLERPATH . $dir ))
    {
      if (is_file ( CONTROLLERPATH . $dir . '/class.' . $name . '.php' ))
      {
        require_once CONTROLLERPATH . $dir . '/class.' . $name . '.php';
      }
    }
  }
}

Listing 4

<?php

class ldapModuleMapper
{
static function createLdapModuleWarpper(){
  return new self;
}

public function getModuleForAuth(ldapgruppen $ldapgruppen)
{
  $moduleList=moduleList::createModuleList();
  foreach($ldapgruppen->getGruppen() as $group)
  {
    $controllername=$group."Controller";
    if(class_exists($controllername))
    {
      $module=new module();
      $module->setModulName($controllername);
      $moduleList->setModuleList($module);
    }
  }
  return $moduleList;
}
}
?>

Listing 5

$module=ldapModuleMapper::createLdapModuleWarpper()->getModuleForAuth($ldapgroups->getGruppen())->getModuleList();
if(count($module)==1)
{
  $modul=$module[0]->getModulName();
  $controller= new $modul();
  $controller->run();
}
Else
{
  $view=new startView();
  $view->display($module);
}
Über den Autor

Martin Schäpker

Kommentare

3 Comments

  1. Also nachdem abends um 10 noch kein Kommentar dazu aufgelaufen ist .. ist da irgendwas falsch 🙂

    Martin, nimm’s mir nicht übel .. aber das Ganze ist irgendwie gefühlt grob zusammen gewürfelt.

    Warum alleine durch die Aktivierung der LDAP-Ext irgendwas in $_SERVER gesetzt werden soll, erklärt sich mir nicht ganz?

    Dass in einer Firma die bereits eine solche Größe erreicht hat, dass die IT sich für nen LDAP entschieden hat, die Gruppenstruktur nach den „Web-Fuzzies“ ausgerichtet wird, halte ich persönlich für relativ unwahrscheinlich. Aber falls das dennoch passieren sollte – die Intranet anwenden die ich kenn, sind gerade froh drüber, dass sie ihre eigene Rechte-Verwaltung haben .. weil halt doch irgendwie jeder irgendwas anderen können darf, aber nur in der Anwendung und nicht in der.

    Interesannter wäre vielleicht gewesen, wie man in nem Internet Explorer ne automatische authentifierzung aufgrund vorhandener Domain-Anmeldung hinkriegt oder sowas? Nur als Anregung 🙂

    Steffkes

    Reply
  2. @Steffkes

    Danke für die Anmerkungen, natürlich ist es mit dem einschalten der Ext nicht getan, dazu sind noch einige Einstellung am Server nötig auf die ich aber nicht nähr eingehen wollte, die man sich bei Bedarf über Google aber auch relativ problemlos besorgen kann.

    Zur Gruppenstruktur, was spricht dagegen für die „Web-Fuzzis“ eine eigene Gruppenrichtlinie zu schaffen? Selbst wenn das nicht der Fall sein sollte dann kann über einen Wrapper relativ leicht ebenfalls eine vorhanden Stuktur übernommen werden.

    und das or die() benutze ich für Beispielcode schon… im Originalcode sieht das anders aus aber das ist hoffentlich jedem klar….

    Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen