Filter
Filter sind Controller, die vor dem Haupt-Controller ausgeführt werden. Damit lassen sich Web-Applikationen überwachen und beeinflussen.
Filter registrieren
Filter unterscheiden sich im Aufbau nicht von Haupt-Controllern, jedoch können pro Request mehrere Filter ausgeführt werden. Somit könntest du für denselben Kontextpfad auch mehrere Filter registrieren.
[routing] filters[] = "/example > atusch\filter\ExampleFilter" filters[] = "/example > atusch\filter\SomeOtherFilter"
Genau wie Haupt-Controller erweitern Filter üblicherweise n2n\http\controller\ControllerAdapter
.
class ExampleFilter extends ControllerAdapter { public function doFoo(array $params) { if ($params[0] == 'baz' && '127.0.0.1' != $this->getRequest()->getRemoteIp()) { throw new ForbiddenException(); } } }
Oben stehender Filter stellt sicher, dass nur von der lokalen Maschine auf http://[url-to-n2n-public]/example/foo/baz/...
zugegriffen werden kann.
Controlling Plan
n2n erstellt für jeden Request einen n2n\http\controller\ControllingPlan
, auf den du über ControllerAdapter::getControllingPlan()
zugreifen kannst. Der Controlling-Plan beinhaltet die Filter und den Haupt-Controller, die für den aktuellen Request ausgeführt werden sollen. Der Controlling-Plan lässt sich zur Laufzeit modifizieren, was besonders in Filtern nützlich sein kann. Über ControllingPlan::abort()
kannst du zum Beispiel das Ausführen des Controlling-Plans abbrechen.
Möchtest du zum Beispiel einen Bereich http://[url-to-n2n-public]/secure/...
mit einer Zugriffskontrolle schützen, könntest du dafür einen Filter registrieren:
[routing] filters[] = "/secure/** > atusch\filter\AuthorizationFilter"
Folgendes Beispiel zeigt dir, wie du einen solchen Filter implementieren könntest:
class AuthorizationFilter extends ControllerAdapter { public function index(LoginContext $loginContext) { if ($loginContext->hasUser()) { return; } $this->forward('view\login.html', array('loginContext' => $loginContext)); $this->getControllingPlan()->abort(); } }
Dieser Filter überprüft, ob der Benutzer angemeldet ist. Sollte er dies nicht sein, gibt er eine Login-View aus und bricht die Ausführung des Controlling-Plans ab. Der im Beispiel verwendete Typ LoginContext
ist fiktiv und müsste selbst erstellt werden.