Vor ein paar Tagen kamen einige meiner Kollegen auf mich zu und sprachen mich mit einem Problem mit einer Open-Source-Anwendung namens Makaut Buddy an. Dabei handelt es sich um eine für unsere Universität entwickelte Plattform zum Teilen von Notizen, die Studenten dabei helfen soll, ihre Notizen, Fragen aus früheren Prüfungen und YouTube- Tutorials effizient auszutauschen.
Obwohl sie erfolgreich ein System zum Hochladen von Ressourcen entwickelt hatten, standen sie vor der Herausforderung, sicherzustellen, dass nur autorisierte Personen Inhalte hochladen konnten.
Wie in der Demo unten gezeigt, konnte jeder Benutzer nach der Anmeldung eine Ressource erstellen. Dies stellte ein großes Problem dar, da wir nicht kontrollieren konnten, was Benutzer hochladen. Manche luden möglicherweise sogar schädliche oder verstörende Inhalte hoch.
Zunächst definierten sie eine Administratorrolle und erteilten einer ausgewählten Gruppe von Personen Administratorrechte. Mit zunehmender Anzahl von Rollen wurde der Code jedoch zunehmend komplexer und schwieriger zu verwalten.
Da kam mir die Idee, diesen Artikel zu schreiben, um das Bewusstsein für effiziente Möglichkeiten der Autorisierungsverwaltung mithilfe eines rollenbasierten Zugriffskontrollmodells (RBAC) und der Hilfe von Autorisierungstools von Drittanbietern wie Permit zu schärfen.
Zusätzlich zur Implementierung von RBAC haben wir auch ein System zur Genehmigung von Zugriffsanfragen eingeführt. Dieses System stellt sicher, dass jeder Benutzer, der Inhalte hochladen möchte, zuerst Zugriff anfordern muss, den ein Administrator dann genehmigen oder verweigern kann. Diese zusätzliche Sicherheitsebene hilft uns, die Integrität der Inhalte auf Makaut Buddy aufrechtzuerhalten.
In diesem Artikel habe ich JavaScript als Programmiersprache und Next.js als Framework verwendet. Die hier besprochenen Konzepte sind jedoch nicht sprachspezifisch und Sie können sie in Ihrer bevorzugten Programmiersprache implementieren.
Am Ende dieses Artikels wissen Sie, wie Sie ein grundlegendes RBAC-Modell in Ihrer Anwendung implementieren.
Nachdem das gesagt ist, tauchen wir ein!
Erinnern Sie sich an die Morgen, an denen Sie zur Schule eilen mussten? Der Sicherheitsbeamte, der Ihren Ausweis überprüft, ist ein perfektes Beispiel für Authentifizierung. Er überprüft Ihre Identität als Student, der auf den Campus darf. Aber das ist nur der erste Schritt. Selbst nach der Identifizierung würden Sie nicht einfach in jeden beliebigen Hörsaal gehen, oder? Hier kommt die Authentifizierung ins Spiel.
Stellen Sie sich Ihren Stundenplan als Ihre Berechtigung vor. Er gewährt Ihnen Zugang zu bestimmten Bereichen (Klassenräumen) basierend auf Ihrer Rolle (Student, der an diesem Kurs teilnimmt). Sie wären nicht berechtigt, das Lehrerzimmer oder den gesperrten Bereich der Bibliothek zu betreten – auch wenn Sie Student (authentifiziert) sind.
Der Unterschied zwischen Authentifizierung und Autorisierung ist wie die Frage „Wer sind Sie?“ gegenüber „Was dürfen Sie tun?“
Autorisierung ist in jeder Organisation wichtig, da sie verhindert, dass Personen Aktionen ausführen, zu denen sie nicht autorisiert sind. Dies gewährleistet die Sicherheit der Organisation und hilft, Verluste zu vermeiden.
Lassen Sie uns die obige Aussage anhand eines Beispiels veranschaulichen:
In einem Unternehmen gibt es einige erfahrene Ingenieure und einige Praktikanten, die noch in die Praxis einsteigen. Sie können sich vorstellen, was für ein Desaster es wäre, wenn sowohl der erfahrene Ingenieur als auch der Praktikant die gleichen Berechtigungen hätten. Die Praktikanten, die noch in der Lernphase sind, könnten unwissentlich Fehler machen, für die das Unternehmen bezahlen muss. In solchen Situationen funktioniert das rollenbasierte Zugriffskontrollmodell am besten, da die Berechtigungen nicht einzelnen Personen, sondern Rollen zugewiesen werden. Beispielsweise kann nur ein erfahrener Ingenieur oder ein technischer Leiter Ressourcen löschen, während alle Praktikanten Ressourcen nur anzeigen und verwalten können.
Sehen wir uns als Nächstes an, wie wir RBAC in einer Anwendung implementieren können.
Zuerst müssen wir Rollen definieren und jeder Rolle Berechtigungen zuweisen.
Hinweis: Eine Rolle ist die Position oder Aufgabe, die jemand in einer Organisation hat. Wir benötigen Rollen, damit wir zwischen einzelnen Personen anhand der dieser Rolle zugewiesenen Berechtigungen oder Privilegien unterscheiden können.
Wir müssen jedem Benutzer der Anwendung eine Rolle zuweisen können. Dies geschieht im Allgemeinen, nachdem sich der Benutzer angemeldet hat.
Wir benötigen eine API in unserem Backend, die die vom Benutzer auszuführenden Operationen aufnimmt und die Autorisierung des Benutzers überprüft. Das folgende Diagramm soll Ihnen ein besseres Verständnis vermitteln:
Wir werden das gesamte Modell jedoch nicht von Grund auf neu implementieren. Stattdessen verwenden wir ein Autorisierungstool eines Drittanbieters namens Permit, das den gesamten Prozess der Autorisierung für uns sehr reibungslos und effizient gestaltet, sodass Sie an den Funktionen arbeiten können, die wirklich wichtig sind.
Das folgende Diagramm zeigt Ihnen, wie wir Permit nutzen, um RBAC in unseren Anwendungen zu implementieren:
In diesem Abschnitt gehen wir die Schritte zur Implementierung der rollenbasierten Zugriffskontrolle (RBAC) mit Permit durch.
Da wir zum Einrichten eines RBAC-Modells ein Permit verwenden, müssen wir zuerst ein Permit-Konto und einen Arbeitsbereich erstellen:
Jetzt müssen wir eine Ressource erstellen, also die Entität, auf die wir in unserer Anwendung den Zugriff steuern möchten.
In einer Anwendung zum Erstellen von Notizen wäre die Ressource beispielsweise „Notizen“ und die Aktionen könnten „Erstellen “, „Lesen“, „Aktualisieren“ und „Löschen“ sein.
So erstellen Sie eine Ressource:
Im obigen Beispiel lautet der Ressourcenname „Notes“ und die Aktionen, die der Benutzer ausführen darf, sind „Erstellen“, „Lesen“, „Aktualisieren“ und „Löschen“.
Nachdem wir die Ressource erstellt haben, müssen wir die Rollen definieren, die in unserer Anwendung vorhanden sein werden.
Da es sich bei der Anwendung in diesem Fall um eine Anwendung zum Teilen von Notizen für eine Universität handelt, lauten die Rollen wie folgt:
Nachdem wir beide Rollen erstellt haben, müssen wir nun die Aktionen zuweisen, die jede Rolle in unserem Richtlinieneditor ausführen kann, wie unten gezeigt:
Nachdem Ihr Permit-Konto nun konfiguriert ist, können Sie mit der Erstellung der Backend-APIs zur Kommunikation mit Permit beginnen. Wir verwenden das von Permit bereitgestellte Node.js SDK. Das SDK für Ihre bevorzugte Programmiersprache finden Sie in der Permit-Dokumentation.
Benutzer synchronisieren und Standardrolle zuweisen
Zunächst müssen wir sicherstellen, dass jeder Benutzer, der sich in unserer Anwendung anmeldet, mit dem Permission-Verzeichnis synchronisiert und ihm die Standardrolle „Student“ zugewiesen wird.
Dazu müssen wir eine Backend-API wie unten gezeigt erstellen:
Diese API macht zwei Dinge:
createUser
API.assignRole
API eine Standardrolle zu.
Weitere Informationen zu allen von Permit bereitgestellten APIs finden Sie unter Permit-Dokumente.
Benutzerrolle abrufen
Als Nächstes müssen wir eine Backend-API erstellen, die die Rolle des Benutzers von Permit.io abruft und an das Frontend zurücksendet.
Die unten gezeigte API ruft den Benutzer mithilfe von permit.api.users.get(user_key)
ab.
Diese API erhält die Benutzerrolle, mit der wir unsere Front-End-Komponenten so manipulieren können, dass nur Personen mit Sonderrollen sie sehen können.
Sie können auch die Funktion allow.check() ausprobieren, um zu überprüfen, ob ein Benutzer mit einer bestimmten Rolle berechtigt ist, einen Vorgang auszuführen.
Damit haben wir erfolgreich ein RBAC-Modell mit Permit implementiert. Jetzt können wir die Backend-Routen mit dem Frontend-Framework oder der Bibliothek Ihrer Wahl integrieren, um das Setup abzuschließen.
Um unser Setup abzuschließen, benötigen wir eine Komponente, die es Benutzern ermöglicht, Rollen-Upgrades anzufordern:
Permit Elements sind Teil von „Permit Share-If“, einer Suite vorgefertigter, einbettbarer UI-Komponenten, die die Zugriffsfreigabe in Anwendungen zum Kinderspiel machen. Sie wurden entwickelt, um eine voll funktionsfähige Zugriffskontrolle zu bieten und machen die Delegierung der Berechtigungsverwaltung an Ihre Benutzer einfach und sicher.
Das ist es, wir haben die Elemente erstellt.
Bevor wir die Elemente verwenden können, müssen wir eine Backend-API für die Anmeldung des Benutzers beim Permission-Element erstellen.
Hinweis: Es ist wichtig, den Benutzer so früh wie möglich anzumelden, am besten direkt nach der Registrierung.
Schauen wir uns nun den Code an:
API-Code, der am Endpunkt /api/v1/login_permit/?userkey=user_key
bereitgestellt wird:
Der Frontend-Code zur Implementierung der Anmeldung sieht folgendermaßen aus:
Das war’s, wir haben unseren Code eingerichtet.
Jetzt müssen wir nur noch zum Genehmigungs-Dashboard gehen und sowohl das Benutzerverwaltungs-Iframe als auch das Zugriffsanforderungs-Iframe kopieren, wie unten gezeigt:
Nachdem wir nun den Code haben, müssen wir das iframe
zu unserem Frontend hinzufügen, wo wir unseren Benutzern die Elemente anzeigen möchten. Dazu müssen wir:
Damit haben wir erfolgreich ein Zugriffsgenehmigungssystem eingerichtet, bei dem Benutzer Rollen-Upgrades anfordern und Administratoren diese Anforderungen genehmigen oder ablehnen können.
Diese Demo zeigt, wie ein Benutzer mit der Rolle „Admin“ auf das Upload-Widget zugreifen kann
Diese Demo veranschaulicht, wie ein Benutzer mit der Rolle „Student“ das Upload-Widget nicht sehen kann und ein Upgrade auf die Rolle „Admin“ anfordern kann:
Diese Demo zeigt, wie privilegierte Benutzer Anfragen für Rollen-Upgrades genehmigen können:
Diese Demo zeigt, wie ein Benutzer nach der Heraufstufung von „Student“ auf „Admin“ Zugriff auf das Upload-Widget erhält.
Das ist es!
Vielen Dank, dass Sie bis hierher gelesen haben.
In diesem Tutorial haben wir uns mit Autorisierungen befasst und verstanden, warum Autorisierung in jeder Anwendung sehr wichtig ist. Wir haben uns auch angesehen, wie wir Permit einrichten und konfigurieren können, um die Anwendung zu sichern und den Benutzerzugriff basierend auf ihren Rollen zu steuern.
Dieser Artikel ist nur die Spitze des Eisbergs der Autorisierung und des RBAC-Modells. Für eine detailliertere Autorisierung können Sie sich ABAC und ReBAC ansehen.