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

qlink('Greet the ' . $galaxy, 'helloworld/universe/galaxy', array('galaxy' => $galaxy)); ?>

Sorry, you're not allowed to greet any galaxy

--
Nun, wie immer hoffe ich dass dieser Beitrag keine Fragen unbeantwortet lässt. Falls euch dennoch die Neugierde (oder Ratlosigkeit) übermannt, meldet euch doch bitte im Forum. Danke und bis zum nächsten Mal!
Ach und fast hätt' ich es ja doch noch vergessen: Der Hello World tarball, Teil 3

Johannes Meyer
Johannes Meyer
Developer

Johannes ist seit 2011 bei uns und hilft bei der Entwicklung zukünftiger Knüller (Icinga2, Icinga Web 2, ...) aus dem Hause NETWAYS.