Projekte mit Laravel – Teil2 – Authentifizierung und Autorisierung mit Rollen

Laravel Tutorial Teil 2 zum Thema Authentifizierung und Autorisierung mit Rollen.

Authentifizierung mit Laravel

Um mit Laravel schnell Authentifizierung zu ermöglichen, kann man mit folgendem Befehl entsprechende Datenbank, Templates, Routes und Controller erstellen:

Die entstehende Migration führen wir zum jetzigen Zeitpunkt noch nicht aus. Wir wollen die Authentifizierung gleich noch erweitern.

Mit der Laravel-Authentifizierung können sich nun Nutzer registrieren und ein Passwort vergeben und sich dann anmelden. Über entsprechende Methoden können dann Aktionen z.B. im Controller geschützt werden und auf angmeldete Benutzer (also authentifizierte Benutzer) eingeschränkt werden.

Erweiterung der Authentifizierung mit Rollen-Autorisierung

Nachdem wir nun die Authentifizierung über php artisan make:auth implementiert haben, werden wir das Ganze noch etwas erweitern. Laravel bringt selbst zwar die Möglichkeiten von Gates und Policies mit. Ich möchte jedoch das Ganze an ein klassisches Rollensystem knüpfen. Zur Autorisierung mit Laravel-Bordmitteln komme ich später in einem weiteren Teil des Tutorials noch.

Dazu gibt es auch bereits „fertige“ Pakete, aus didaktischen Gründen macht jedoch der „Nachbau“ eines solchen Systems sinn, um die Arbeitsweise und das Vorgehen besser zu verstehen. Außerdem folgt es dem KISS-Prinzip und man verhindert unnötigen Overhead ;-).

Die folgenden Ausführungen sind an einige Tutorials angelehnt und für meine Zwecke angepasst.

Vorüberlegungen

Für meine Rollen-Autorisierung möchte ich vier Rollen einfügen:

  1. Administratoren (admin)
  2. Bearbeiter (editor)
  3. Autoren (author)
  4. Benutzer (user)

Die Reihenfolge gibt eine gewisse „Rechtehierarchie“ vor. Soll heißen: Administratoren haben mehr rechte also Bearbeiter etc. Wir könnten die Gruppen aber auch ganz anders benennen. Vorstellbar wäre „Arbeitsgruppe 1“, „Arbeitsgruppe 2“ etc. Dann ist keine klassische Hierarchie im engeren Sinne vorhanden. Auch dies ist möglich. Zu den Beispielen wie man das Rechtesystem nun nutzen kann, komme ich zu einem späteren Zeitpunkt. Jetzt erstmal zur Einrichtung.

Das Rollen-Modell

Zunächst benötigten für unsere Rollen natürlich ein Modell samt Datenbanktabellen und Inhalt. Zum einen werden die Rollen selbst benötigt und zum anderen eine Zuordnung von Nutzern und Rollen. Beginnen wir mit dem Rollen-Modell.

Dazu weisen wir Laravel an uns zunächst ein Modell namens „Role“ zu generieren:

Der Parameter -m erzeugt uns dabei gleich die notwendige Migrations-Datei mit der Bezeichnung create_roles_table.php im Ordner /database/migrations. Diese werden wir auch so gleich bearbeiten. Das erzeugte Grundgerüst für die Erstellung der roles-Tabelle erweitern wir um zwei Felder:

  • Rollenbezeichnung (name)
  • Rollenbeschreibung (description)

dazu fügen wir die hervorgehobenen Zeilen in unsere up()-Methode ein:

Als nächstes erstellen wir nun die Migration für die Benutzer-Rollen-Zuweisung, also eine role_user Pivot-Tabelle:

Die dadurch erstelle Migrations-Datei wird ebenfalls angepasst. Wir finden Sie im Migrations-Ordner mit einem Zeitstempel gefolgt von der Bezeichnung create_role_user_table.php. Wir fügen hier ebenfalls zwei Felder in der up()-Methode ein, denn wir müssen einen Benutzer (user_id) zu einer Rolle (role_id) zuordnen. In diesem Fall verzichten wir auf die Laravel-Zeitstempel und entfernen die Zeile.

Damit haben wir nun die notwendigen Datenbanktabellen und Model-Dateien erstellt. Damit man später mit den Rollen arbeiten kann, fügen wir ins User- und ins Role-Modell noch die n:m-Beziehung (in Laravelsprache auch many-to-many relationship) ein. Dazu fügen wir jeweils eine Methode ein:

User-Modell

Role-Modell

Wer genau hingeschaut hat, dem wird etwas auffallen: Der ein oder andere ist davon ausgegangen, dass einem Benutzer jeweils nur eine Rolle zugewiesen werden kann. Das ist nicht der Fall. Ein Benutzer kann über beliebig viele Rollen verfügen. Wir ergänzen im User-Modell noch ein paar weitere Methoden, damit wir später auch überprüfen können, ob ein Nutzer eine bestimmte Rolle besitzt:

  • authorizeRoles
  • hasAnyRole
  • hasRole

unser User-Modell sollte nun also so aussehen (gekürzt):

Anpassung der Laravel-Registrierung

Nachdem wir nun alle Vorbereitungen getroffen haben sollten wir zunächst die Registrierung von Laravel anpassen. Aktuell würde dies nicht funktionieren. Wir müssen nämlich dem Nutzer nach der Registrierung noch automatisch eine Rolle zuweisen. Soll ja nicht gleich jeder Admin weden ;-).

Dazu passen wir die create()-Methode im Register-Controller unter app/Http/Controllers/Auth/RegisterController.php an:

Damit haben wir nun fasst alles geschafft. Jetzt müssen noch ein paar Dummy-Benutzer sowie deren Rollenzuordung in die Datenbank. Dies kann man einfach mit Laravels seeding-Funktion machen. Dazu rufen wir folgende Befehle auf:

Dadurch werden zwei Seed-Klassen namens RoleTableSeeder und UserTableSeeder im Verzeichnis database/seeds/ erstellt. Diese passen wir dann entsprechend an.

RoleTableSeeder-Klasse

UserTableSeeder-Klasse

Damit diese beiden Klassen auch entsprechend ausgeführt werden, muss jetzt noch eine letzte Anpassung in der DatabaseSeeder-Klasse im gleichen Verzeichnis durchgeführt werden.:

Puh geschafft … ein letzter Befehl setzt nun alles in die Tat:

Wer nun in die Datenbank blickt findet nun vier Nutzer mit entsprechenden Rechten. Der Einfachheit halber wurden die Nutzer entsprechend ihrer Rollen benannt und besitzen jeweils das Passwort „pass“.

Nun haben wir also alles fertig vorbereitet um in unserer Anwendung diese Rollen zur Autorisierung zu verwenden. Wie das funktioniert erfahrt ihr im nächsten Teil.

 

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert