Warning: include_once(/var/www/html/pmwiki-2.2.86/cookbook/soap4pmwiki/soap4pmwiki.php): failed to open stream: No such file or directory in /var/www/html/fields/dbp09/local/config.php on line 4

Warning: include_once(): Failed opening '/var/www/html/pmwiki-2.2.86/cookbook/soap4pmwiki/soap4pmwiki.php' for inclusion (include_path='.:/opt/php/lib/php') in /var/www/html/fields/dbp09/local/config.php on line 4

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/fields/dbp09/local/config.php:4) in /var/www/html/pmwiki-2.2.86/pmwiki.php on line 1250
Datenbankpraktikum SS 2009 - Gruppe 3 - Grundgeruest Login

Grundgerüst und Login

von F.Hebestreit, P. Middendorf, D.Künne

Konzept und Dateisystem

Abb. 1: MVC

Das System orientiert sich am Model-View-Controller-Konzept. Die Modelklassen entsprechen den Entitäten bzw. Beziehungen der Datenbank, die Controller benutzen die Modelklassen und geben die aufbereiteten Daten an die Templates weiter. Diese werden geparst und geben einen String zurück, der an den Client geschickt wird.

Abb. 2: Das Tuks-Dateisystem

Im Grundordner befindet sich der Einsprungpunkt index.php. Die Models befinden sich in models/, die Controller in controllers/ und die Bibliotheken und global verfügbaren Dateien in lib/. Die Templatedateien befinden sich in views/.

Mechanik

Eine URL in Tuks hat immer die Form:

index.php?controller=a&action=b

Hierbei bezieht sich a auf eine Klasse aus dem Verzeichnis controllers/. Wird kein Parameter angegeben, wird der Session_Controller geladen, der sich um das Ein- und Ausloggen kümmert. Der Parameter action gibt an, welche Methode aus dem Controller aufgerufen wird. Wird action nicht angegeben, wird eine Standard-Action aufgerufen. Es können natürlich noch weitere Parameter in der URL übergeben werden.

Controller-Basisklasse, Rechte

Jeder der Controller erbt von der abstrakten Klasse Controller, die vereinfacht wie folgt aussieht:

abstract class Controller
{
  protected $env;
  protected $rechte;
 
  function hole_resultat();
  abstract function action_();
}

Die Klasse enthält ein Umgebungsobjekt, was die Datenbankverbindung enthält sowie den momentan eingeloggten User. So können alle abgeleiteten Controller komfortabel darauf zugreifen.

#Die Umgebungsklasse
Abb. 3: Die Umgebungsklasse

Die Variable $rechte ist ein Array, was einer Controller-Aktion die Rechte zuordnet, die der User haben muss, um die Aktion auszuführen. Die Klassen, die von Controller erben, füllen das Array mit sinnvollen Werten, beispielsweise:

$rechte = 
  array(
    'zulassungen_anzeigen' => array(RECHTE_DOZENT,RECHTE_UEBUNGSLEITER),
    'leistung_anzeigen' => array(RECHTE_DOZENT,RECHTE_UEBUNGSLEITER,RECHTE_TUTOR));

Hier kann die Aktion "zulassung_anzeigen" also nur ausführen, wenn man Dozent oder Übungsleiter ist. Die Aktion "leistung_anzeigen" kann man auch als Tutor ausführen.

Die Methode hole_resultat der Controller-Basisklasse sieht vereinfacht so aus:

function hole_resultat()
{
  if (!isset($action))
    $action = '';
 
  $s = schnittmenge($rechte[$action],meine_rechte($vorlesung));
 
  if (leere_menge($s))
    throw new Exception('Unzureichende Rechte');
 
  ('action_'.$action)();
}

Die Methode meine_rechte bekommt die aktuell ausgewählte Vorlesung übergeben und bezieht diese in das Ergebnis mit ein, sodass beispielsweise ein Tutor nur in seinen eigenen Vorlesungen Aktionen durchführen kann. Sind keine Rechte für eine AKtion definiert und soll diese Aktion ausgeführt werden, gibt es eine Fehlermeldung als Sicherheitsmaßnahme.

Damit obige Methode auch im Fall einer leeren Variable $action funktioniert gibt es die abstrakte Methode action_. Sie repräsentiert die besagte Standard-Action. Jeder abgeleitete Controller muss selber entscheiden, was in dem Fall zu tun ist, aber meistens ist das Weglassen einer Action einfach ungültig.

Die action_-Methoden, die von hole_resultat aufgerufen werden, geben entweder einen String zurück, der dann in den Inhaltsbereich der Seite eingefügt wird, oder ein Weiterleitungsobjekt, das eine Weiterleitungs-URL enthält. Auf diese Art und Weise können Controller aufeinander oder auf andere Aktionen verweisen; ein Controller zum Anlegen eines Studenten könnte nach dem Anlegen eine Liste von allen Studenten anzeigen beispielsweise.

Model

Das Interface für Model sieht wie folgt aus:

abstract class Model
{
  protected $env;
 
  abstract function insert();
  abstract function delete();
}

Auch das Model benötigt die Datenbankverbindung sowie den eingeloggten User und bekommt somit vom Controller das Umgebungsobjekt.

Die abgeleiteten Models (beispielsweise Person) bekommen alle ihre Daten im Konstruktor übergeben. Daraufhin kann man insert aufrufen um das Model zu "instanziieren". Auf ein bereits instanziiertes Model kann man delete aufrufen um diese wieder zu löschen. Updates werden von den abgeleiteten Models selber geregelt. Beispiel:

$p = new Person("pmiddend","Phlpp","Middendorf",...);
$p->insert();
$p->Vorname = "Philipp";
$p->update();

Fazit

Das vorgestellte System hat einige Vorteile gegenüber eines naiveren Ansatzes. Um neue Funktionalität einzubinden - also etwa einen neuen Controller - reicht es aus, eine neue Klasse hinzuzufügen und diese von Controller ableiten zu lassen. Auch die Rechteverwaltung wird dem Programmierer komplett abgenommen und in eine tiefere Programmebene verschoben.

Login

Um eine Sitzung in Tuks aufrecht zu erhalten werden Cookies genutzt. Man meldet sich in einem Formular mit Name und Passwort an, woraufhin der Session_Controller mit der Aktion action_login aktiviert wird. Dieser Controller sieht vereinfacht so aus:

class Session_Controller extends Controller
{
  function action_login()
  {
    if (anzahl_reihen(sql("SELECT COUNT(*) FROM Personen WHERE Login=? AND Passwort=MD5(?)")) > 0)
    {
      setze_cookie('login',array($name,md5($passwort)),aktuelle_zeit() + 2*3600);
      return startseite();
    }
    else
      error("Falscher Benutzername bzw. falsches Passwort!");
  }
 
  function action_logout()
  {
    lösche_cookie('login');
    return startseite();
  }
}

Dieser überprüft, ob es den Nutzer mit dem Passwort in der Datenbank gibt und füllt daraufhin den Cookie namens login mit einem Array bestehend aus dem Login und dem verschlüsseltem Passwort. In index.php wird dann bei jedem Seitenaufruf ein Abgleich mit der Datenbank und dem Cookie durchgeführt. Dies muss geschehen, weil die Cookies clientseitig gespeichert werden, also die Möglichkeit von Missbrauch besteht.


Page last modified on August 24, 2009, at 12:56 PM