Rechteverwaltung – Alle Benutzer sind gleich, manche sind gleicher

Jede Seite mit mehreren Benutzern benötigt eine mehr oder weniger umfangreiche Rechteverwaltung. Ein simples Blog unterscheidet bereits zwischen Autoren, registrierten Benutzern und einfachen Gästen. ACL – Access Control List – ist eine Technik mit der sich ein flexibles Rechtesystem aufbauen lässt, indem festgelegt wird, welcher Benutzer welche Aktionen ausführen darf. Die hier vorgestellte Variante ist nur eine von vielen Möglichkeiten ein ACL-System aufzubauen.

ACL Aufbau

Das System besteht aus Benutzern, Rollen, Regeln sowie speziellen Bedingungen (Assertions). Einem Benutzer sollen mehrere Rollen aber auch einzelne Regeln zugewiesen werden können. Rollen bestehen aus einer Sammlung von Regeln. Eine Regel bestimmt, welche Aktion erlaubt oder nicht erlaubt ist oder ob eine bestimmte Bedingung erfüllt werden muss. Eine Bedingung kann in diesem Zusammenhang etwa die Einschränkung auf eine bestimmte IP oder ein eingeschränkter Zeitraum sein.

ACL in der Datenbank

Folgende Tabellen werden in der Datenbank benötigt:

  • user
  • role
    • name: z.B. “Admin”, “Guest”, …
    • parent_id: Falls die Rolle die Regeln einer anderen Rolle erben soll.
    • order: Werden einem Benutzer mehrere Rollen zugewiesen, bestimmt diese Rangordnung die Reihenfolge und damit Priorität der jeweiligen Rolle.
  • rule
    • resource: Entspricht einem Controller; z.B.: „site“.
    • pivilege: Entspricht einer Action eines Controllers; z.B.: „index“.
    • assert_id: Falls die Regeln an eine Bedingung gebunden ist.
    • permission: Wird die jeweilige Aktion erlaubt oder verweigert; z.B.: „Allow“/“Deny“.
  • Tabellen zur Zuweisung von Regeln: user_roles, user_rules und role_rules.
  • assert
    • Classname: Der Name der Klasse, in der die Bedingung geprüft wird; z.B.: „IPAssertion“

ACL und das Zend Framework

Das Zend PHP Framework bietet mit der Zend_Acl Klasse bereits eine Implementierung eines ACL-Systems. Im Folgenden möchte ich die wichtigsten Funktionen vorstellen:

// Instanz von Zend_Acl mit welcher die Rechteverwaltung realisiert wird.
$acl = new Zend_Acl();

// Hinzufügen einer Rolle ‚guest‘.
$acl->addRole(new Zend_Acl_Role(‘guest’));

// Der Benutzer (hier repräsentiert als Rolle) ‚myUser‘ erbt die Rolle ‚guest‘.
// Auf dieselbe Weise können auch Rollen Eigenschaften anderer Rollen erben.
$acl->addRole(new Zend_Acl_Role(‘myUser’), ‘guest’);

// Hinzufügen einer Ressource (Controller)
$acl->add(new Zend_Acl_Resource(‘site’));

// Deny All
$acl->deny(null);
// Setzen der Zugriffsrechte von Rollen auf Ressourcen/Privilegien mit Bedingung:
// *Assertion sind Klassen, welche Zend_Acl_Assert_Interface implementieren.
$acl->allow(‘guest’, ‘site’, ‘index’);
$acl->deny(‘guest’, ‘site’, null, IPAssertion);
$acl->allow(‘myUser’, ‘site’, ‘index’, TimeAssertion);
$acl->allow(‘myUser’, ‘site’);

// Abfrage eines Zugriffsrechts
$acl->isAllowed(‘myUser’, ‘site’, ‘index’);

ACL im Einsatz

Um das oben beschriebene System zu implementieren muss also zunächst eine Zend_Acl Instanz erstellt werden. Dieser werden alle Rollen aus der Datenbank übergeben. Der Benutzer wird ebenfalls angelegt und mit seinen zugewiesenen Rollen übergeben (als zusätzlicher Parameter von addRole(), sodass deren Eigenschaften dem Benutzer vererbt werden). Anschließend werden die Ressourcen erstellt und übergeben. Mittels deny(null) können alle Zugriffe verhindert werden. Nun folgen die Regel-Zuweisungen via allow() und deny() Aufrufe, wodurch den Rollen die jeweiligen Ressourcen, Privilegien und Bedingungen zugewiesen werden. Beim Aufruf eines Controllers und dessen Action kann nun das Zugriffsrecht mittels der Methode isAllowed() überprüft werden.

Autor: Daniel Leeb»Kontakt

Daniel Leeb ist Mitarbeiter bei der Lorem Ipsum Mediengesellschaft m.b.H. und zuständig für die Neu- und Weiterentwicklung von Webanwendungen. Folgen Sie ihm via RSS.

Kommentare

Kommentare sind geschlossen.