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);
}
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
Ahso ja .. äh, or die() .. aus welcher Zeit genau ist dieser Artikel doch gleich gewesen? 🙂
@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….