Inzwischen wisst ihr wie man ein neues Icinga Web 2 Modul anlegt und welche Möglichkeiten euch für die Navigation innerhalb eines Icinga Web 2 Moduls offen stehen. Heute möchte ich euch nun vorstellen wie es möglich ist, den Zugriff darauf zu kontrollieren.
Eine kleiner Hinweis vorweg: Da wir im folgenden keine neuen Elemente im UI einfügen werden, müsst ihr leider auf eine bebilderte Führung verzichten und euch mit hartem Code zufrieden geben. Dafür gibt es am Ende dieses Eintrags einen tarball mit dem daraus resultierenden aktuellem Stand des „Hello World“ Moduls.
Anonymer Zugriff
Möchte man Zugriff auf eine Route erlauben, ohne einen angemeldeten Benutzer zu erfordern, kann man die Autorisation für einen Controller vollständig deaktivieren. Beachtet allerdings, dass in diesem Falle keinerlei Rechte-Kontrolle mehr vorgenommen wird.
Wir möchten nun für dieses Beispiel anonymen Zugriff auf den IndexController erlauben:
IndexController.php
Mit dem gerade hinzugefügten (bzw. überschriebenen) Klassen-Attribut $requiresAuthentication ist es nun möglich ohne Anmeldung auf die Basis-Route des "Hello World" Moduls zuzugreifen. Das ist die statische Lösung, es gibt allerdings noch eine dynamische Alternative welche es möglich macht bedingt zu entscheiden ob die Route eine Anmeldung benötigt:
IndexController.php
requiresAuthentication = rand(1, 2) % 2;
return parent::requiresLogin();
}
public function indexAction()
{
// *Snip*
Icinga Web 2 zeigt für Ansichten die keine Anmeldung erfordern dennoch das Menü und den Header an. Möchte man dies unterbinden, kann man dies entweder über die URL tun (?showFullscreen bzw. ?showFullscreen&showCompact) oder folgendes Klassen-Attribut im entsprechenden Controller definieren:
IndexController.php
Rechte-Kontrolle für angemeldete Benutzer
Um Benutzern bestimmte Aktionen zu erlauben oder zu verbieten ist es möglich Berechtigungen einzusetzen. Zum Beispiel darf niemand ohne weiteres auf die Routen eines Moduls zugreifen, denn Icinga Web 2 bietet automatisch eine Berechtigung für jedes Modul an, mit welcher der Zugriff auf das gesamte Modul erlaubt oder unterbunden werden kann. Im Falle des "Hello World" Moduls ist dies die Berechtigung "module/helloworld".
Möchte man weitere, granularere Berechtigungen für sein Modul anbieten, muss man diese in der configuration.php zuerst registrieren. Um das zu veranschaulichen, unterbinden wir nun den Zugriff auf den UniverseController mit der Berechtigung "helloworld/universe":
configuration.php
add('Universe', array(
'url' => 'helloworld/universe',
'permission' => 'helloworld/universe',
'priority' => 101
));
$this->providePermission('helloworld/universe', 'Allow to greet the universe');
Indem wir die Berechtigung registrieren, ermöglichen wir Icinga Web 2 sie z.B. in der Rollen-Konfiguration anzuzeigen. Außerdem haben wir sie gleich dem jeweiligen Menü-Eintrag zugewiesen, was dazu führt, dass nur Benutzer mit dieser Berechtigung den Eintrag sehen können. Klicken wir nun allerdings auf den Menü-Eintrag "World", können wir immer noch mit dem Tab "Universe" interagieren. Um das zu unterbinden, erfordern wir zu allererst die Berechtigung für den Zugriff auf den UniverseController:
UniverseController.php
assertPermission('helloworld/universe');
}
// *Snip*
Nun wird die Berechtigung für jede Action des UniverseController erfordert. Da allerdings nun zwar der Zugriff unterbunden wird, wir allerdings immer noch den Tab sehen, ist es notwendig zu überprüfen ob der aktuell angemeldete Benutzer die Berechtigung besitzt bevor wir den Tab hinzufügen:
IndexController.php
add(
'world',
array(
'title' => 'World',
'url' => 'helloworld'
)
);
if ($this->hasPermission('helloworld/universe')) {
$tabs->add(
'universe',
array(
'title' => 'Universe',
'url' => 'helloworld/universe'
)
);
}
return $tabs;
}
Einschränkungen für angemeldete Benutzer
Eine andere Art Benutzern bestimmte Aktionen zu erlauben, zu verbieten oder ihnen nur einen Teil der vorhandenen Informationen anzuzeigen ist es, Einschränkungen zu definieren. Eine Einschränkung ist üblicherweise ein Filter-Ausdruck, kann allerdings alles mögliche darstellen, und wird angewendet sobald ein Benutzer Zugriff erlangt.
Im Falle des "Hello World" Moduls möchten wir nun einschränken können welcher Benutzer welche Galaxie grüßen darf:
configuration.php
provideRestriction('helloworld/filter/galaxy', 'Restrict which galaxies can be greeted');
Die obige Änderung ist wieder deshalb notwendig, damit Icinga Web 2 die Konfiguration der Einschränkung anbieten kann. Natürlich müssen wir nun noch die Einschränkung tatsächlich anwenden, wozu wir uns noch mal den UniverseController ansehen:
UniverseController.php
getRestrictions('helloworld/filter/galaxy') as $filter) {
$permitted = explode(',', $filter);
$providedGalaxies = array_intersect($providedGalaxies, array_map('trim', $permitted));
}
return $providedGalaxies;
}
public function indexAction()
{
$this->getTabs()->activate('universe');
$this->view->galaxies = $this->listPermittedGalaxies();
}
// *Snip*
Und das view script der indexAction:
views/scripts/universe/index.phtml
// *Snip*
Hello Universe
= $this->qlink('Greet the ' . $galaxy, 'helloworld/universe/galaxy', array('galaxy' => $galaxy)); ?>
Sorry, you're not allowed to greet any galaxy
0 Kommentare