So teilen Sie Rollen in einem Laravel-Projekt: Eine Übersicht über RBAC-Pakete

Bei der Entwicklung eines Webprojekts, in dem Benutzerkonten vorhanden sind, stellt sich häufig die Frage, ob ein System von Rollen und Rechten zur Einschränkung des Zugriffs auf bestimmte Abschnitte und Funktionen des Systems eingerichtet werden soll. In diesem Artikel vergleichen wir Zugriffskontrollpakete und fassen die Tabelle zusammen.




Einleitung


In Version 5.1 führte Laravel Auth Gates ein, eine integrierte Framework-Funktion für die Zugriffskontrolle. Bis zu diesem Zeitpunkt musste ich verschiedene Pakete von Drittanbietern verwenden. Der Programmierer hat jedoch auch jetzt noch die Wahl: Schreiben Sie alles selbst oder verwenden Sie ein fertiges Paket. Die erste Option eignet sich gut für kleine Projekte oder Projekte mit einem einfachen System von Rechten und Rollen. Die zweite (mit der richtigen Auswahl des Pakets) ermöglicht eine genauere Abstimmung.

Der Zweck dieses Artikels besteht darin, vorhandene Pakete zu überprüfen, die RBAC (Role Based Access Control) - rollenbasierte Zugriffssteuerung - implementieren. Wir werden gleich klarstellen, dass dieser Artikel nicht die ultimative Wahrheit vorgibt: Jeder Entwickler muss selbst bestimmen, welches Paket er benötigt (wenn überhaupt). Hinweis: In diesem Artikel wird RBAC in Betracht gezogen, daher wird in der Sentinel-Überprüfung nur dieser Teil der verfügbaren Funktionen behandelt.

Paketbeschreibung


Laravel-Erlaubnis von Spatie


Link: https://github.com/spatie/laravel-permission
Dokumentation: https://docs.spatie.be/laravel-permission/v3
Anzahl der Downloads (zum Zeitpunkt des Schreibens): 3.6M
Laravel-Version: ab 5.8 für Version 3
Verfügbarkeit der Schnittstelle: nein (Sie können das Paket verwenden )
Basierend auf Laravel Auth: ja

Eigenschaften
  1. Verfügbarkeit von Handwerkerbefehlen zum Erstellen / Zuweisen von Rechten.
  2. Fertiger Umfang nach Rollen und Rechten.
  3. Die Möglichkeit, Benutzerrechte mithilfe von Standardtools zu überprüfen, da das Paket Laravel Auth Gates verwendet.
  4. Möglichkeit, Blade-Anweisungen des Pakets zu verwenden: role (@hasrole), @hasanyrole, @hasallroles, @unlessrole.
  5. Synchronisation von Rechten und Rollen.

Hinweis: Wenn authorize () für eine Richtlinie aufgerufen wird und die Berechtigung denselben Namen hat wie die Richtlinie, funktioniert sie und nicht die Richtlinie.

DB-Struktur



Codebeispiele

//    $user->givePermissionTo('edit articles'); //    $user->assignRole('writer', 'admin'); //       $user->assignRole(['writer', 'admin']); //    $role->givePermissionTo('edit articles'); 


Türsteher von joseph silber


Link: https://github.com/JosephSilber/bouncer
Dokumentation: https://github.com/JosephSilber/bouncer#introduction
Anzahl der Downloads (zum Zeitpunkt des Schreibens): 418K
Laravel Version: von 5.1.20
Verfügbarkeit der Schnittstelle: nein (Sie können das Paket verwenden )
Basierend auf Laravel Auth: ja

Eigenschaften
  1. Fähigkeit zur Verwendung ohne Laravel.
  2. Synchronisation von Rechten und Rollen.
  3. Die Möglichkeit, Rechte einzuschränken (für eine bestimmte Modellklasse oder für eine bestimmte Instanz).
  4. Ausgabe aller Rechte für „ihre“ Entitäten: Mit der Funktion „toOwn“ können Sie alle Rechte für eine Entität vergeben, die dem Benutzer gehört (der Vergleich der Felder user_id und $ user-> id kann angepasst werden). Sie können die gewährten Rechte mit der Funktion „bis“ einschränken.
  5. Unterstützung für mehrere Mandanten (basierend auf der Scope-Funktion).
  6. Die Möglichkeit, die Funktion "Bereich" zu verwenden, um Rollen und Rechte in Abhängigkeit von den festgelegten Bedingungen (basierend auf einer eindeutigen Kennung) zu trennen, z. B. Rechte im Administrationsbereich und im öffentlichen Teil der Site.
  7. Konsolen-Handwerkerbefehl zum Entfernen nicht verwendeter Berechtigungen aus der Datenbank.
  8. Die Fähigkeit, einen Benutzer schnell zu sperren oder eine Sperre aufzuheben (verbotene Fähigkeit).

Hinweis: Sie können mit nur einer Zeile eine Rolle und Rechte dafür erstellen.

DB-Struktur



Codebeispiele

Einschränkung des Rechts nach Modellklasse oder Instanz:
 Bouncer::allow($user)->to('edit', Post::class); Bouncer::allow($user)->to('edit', $post); 


Ausgabe von Rechten für „ihre“ Einheiten:
 Bouncer::allow($user)->toOwn(Post::class)->to(['view', 'update']); 


Laratrust von santigarcor


Link: https://github.com/santigarcor/laratrust
Dokumentation: https://laratrust.santigarcor.me/
Anzahl der Downloads (zum Zeitpunkt des Schreibens): 601K
Laravel-Version: ~ 6.0
Verfügbarkeit der Schnittstelle: nein
Basierend auf Laravel Auth: no

Eigenschaften
  1. Dies ist ein Fork von ENTRUST ( https://github.com/Zizaco/entrust ).
  2. Es gibt Blade-Direktiven.
  3. Da die Laravel-Standardbefehle durch eigene ersetzt wurden, ist es nicht möglich, mit der Blade-Direktive can zu arbeiten - Sie müssen $ user-> can ('edit-user') oder die Permission- Direktive verwenden.
  4. Synchronisation von Rollen / Rechten.
  5. Verfügbarkeitsfähigkeit - gleichzeitige Überprüfung von Rollen und Rechten.
  6. Bereite Middleware.
  7. Mandantenfähigkeit basierend auf Teams.


DB-Struktur



Codebeispiele
    $user->hasRole(['owner', 'admin']); $user->can(['edit-user', 'create-post']); $user->hasRole('owner|admin'); $user->can('edit-user|create-post');   $user->owns($post) //   $post->user_id   $owner = new Role(); $owner->name = 'owner'; $owner->display_name = 'Project Owner'; // optional $owner->description = 'User is the owner of a given project'; // optional $owner->save(); 


Sentinel von Cartalyst


Link: https://github.com/cartalyst/sentinel
Dokumentation: https://cartalyst.com/manual/sentinel/3.x
Anzahl der Downloads (zum Zeitpunkt des Schreibens): 957K
Laravel-Version: 6.2
Verfügbarkeit der Schnittstelle: nein
Basierend auf Laravel Auth: no

Eigenschaften
  1. Es umfasst nicht nur Rollen und Rechte, sondern auch alles, was mit der Registrierung zusammenhängt.
  2. Die Verpackung ist ein agnostisches Gerüst, d.h. es kann nicht nur in Laravel verwendet werden - Sie müssen lediglich die folgenden Abhängigkeiten mit composer installieren: illuminate / database, illuminate / events, symfony / http-foundation.
  3. Mit dem Sentinel Expired-Permissions-Add-On können Sie Zeitrechte vergeben.
  4. Unterstützt Multitenancy mit dem Sentinel Multitenancy-Add-On.

Hinweis: Bei der Installation unter Laravel 6.2 und PostgreSQL tritt während der Migration ein Fehler auf: Die Benutzertabelle ist bereits vorhanden. In diesem Fall müssen Sie die Standardmigration ändern:



DB-Struktur



Codebeispiele

 //   $user = Sentinel::findById(1); $role = Sentinel::findRoleByName('Subscribers'); $role->users()->attach($user); //   $admin = Sentinel::inRole('admin'); //   $user->permissions = [ 'user.create' => true, 'user.delete' => false, ]; $user->save(); //   $user->hasAccess(['user.create', 'user.update']); Sentinel::hasAnyAccess(['user.admin', 'user.update']); 


Laravel-ACL von Kodeine


Link: https://github.com/kodeine/laravel-acl
Dokumentation: https://github.com/kodeine/laravel-acl/wiki
Anzahl der Downloads (zum Zeitpunkt des Schreibens): 170K
Laravel Version: 5.0 und höher
Verfügbarkeit der Schnittstelle: nein
Basierend auf Laravel Auth: no

Eigenschaften
  1. Synchronisation von Rollen und Rechten.
  2. Erbrechte.
  3. Mit Ihren Blade-Anweisungen: Rolle , Erlaubnis .
  4. Verfügbarkeit der fertigen Middleware.

Hinweis Einige Probleme und Lösungen während der Migration:

  • In der Datei config / acl müssen Sie die Option users_table mit dem Namen der Benutzertabelle hinzufügen, um eine stabile Migration sicherzustellen.
  • Sie müssen das Paket "doctrine / dbal" auf pure Laravel installieren, um sich mit Standardmigrationen "anzufreunden", da andernfalls beim Aktualisieren von Feldern ein Fehler auftreten kann.

DB-Struktur



Codebeispiele
 //   $permissionInternship = Permission::create([ 'name' => 'internships', 'slug' => [ //   'create' => true, 'view' => true, 'update' => true, 'delete' => true, ], 'description' => 'manage internships' ]); $permissionStudent = Permission::create([ 'name' => 'internships.student', 'slug' => [ //     'create' => false, ], //   'inherit_id' => $permissionInternship->getKey(), 'description' => 'student internship permissions' ]); 


Laravel-acl von Mateus Junges


Link: https://github.com/mateusjunges/laravel-acl
Dokumentation: https://mateusjunges.imtqy.com/laravel-acl/
Anzahl der Downloads (zum Zeitpunkt des Schreibens): 1.8K
Laravel Version: 5.0 und höher
Verfügbarkeit der Schnittstelle: ja (vorgefertigte Formulare)
Basierend auf Laravel Auth: no

Eigenschaften
  1. Fertiger Umfang.
  2. Synchronisation von Rechten für Gruppen.
  3. Blade-Direktiven haben: group , @elsegroup, permission , @elsepermission, @ allpermission, @ allgroups, @anypermission, @anygroup
  4. Das Vorhandensein von integrierten Befehlen, mit denen der Handwerker Gruppen / Rechte erstellen und diese anzeigen sowie Benutzerrechte anzeigen kann.
  5. Verfügbarkeit fertiger Middleware: PermissionMiddleware, GroupMiddleware, HierarchicalPermissions, PermissionOrGroupMiddleware.
  6. Verfügbarkeit vordefinierter Formulare für die Rollenverwaltung.

DB-Struktur



Übersichtstabelle





Fazit


Jedes dieser Pakete hat seinen eigenen Anwendungsbereich, so dass es unmöglich ist, einen einzelnen Gewinner zu bestimmen. Nach unseren Schätzungen eignen sich Laravel-Permission und Bouncer am besten für ein komplexes Rollensystem, gleichzeitig gibt es eine Laravel-ACL von Kodeine mit einer Hierarchie von Rollen. Laravel-ACL von Mateus Junges ist eine "frische" Option und verfügt über genügend Funktionen, um eine moderate Anzahl von Rollen zu erstellen. Sentinel ist eine universelle Lösung mit einer Reihe von Funktionen zusätzlich zur Rollenverwaltung. Laratrust ist für diejenigen, die Entrust mögen.

Auch die Standard-Laravel-Tools - Gates und Policies - sind nicht zu übersehen. Sie erleichtern die Unterscheidung des Zugriffs auf Ressourcen in Anwendungen, für die keine komplexen Rechteeinstellungen erforderlich sind. Wenn die Anwendung nur wenige Rollen hat oder keine Hierarchie benötigt wird, können Ihre Anforderungen mit Gates und Policies geschlossen werden.

Nützliche Links


Source: https://habr.com/ru/post/de481796/


All Articles