‫-: Willkommen zurück.
‫Daher haben wir in
‫unserem Projekt bisher die Authentifizierung implementiert.
‫Und es funktioniert gut.
‫Manchmal reicht es jedoch nicht aus, sich
‫einfach zu authentifizieren, also
‫einen Benutzer anzumelden.
‫Und in diesem
‫Video werden wir auch die Autorisierung implementieren.
‫Stellen Sie sich vor, Sie würden eine Tour
‫aus unserer Datenbank löschen.
‫Das sollte natürlich nicht jedem
‫Benutzer erlaubt sein.
‫Auch wenn der Benutzer eingeloggt ist, oder?
‫Wir müssen also grundsätzlich nur
‫bestimmte Benutzertypen autorisieren, um
‫bestimmte Aktionen auszuführen.
‫Und genau das ist die Autorisierung.
‫Es überprüft, ob ein bestimmter Benutzer die Rechte
‫hat, mit einer bestimmten Ressource zu interagieren.
‫Auch hier überprüfen wir grundsätzlich mit Autorisierung, ob
‫ein bestimmter Benutzer auf eine bestimmte Ressource zugreifen darf, auch wenn
‫er eingeloggt ist.
‫Es werden also nicht alle angemeldeten Benutzer die gleichen Aktionen
‫in unserer API ausführen können, in Ordnung?
‫Und dies ist ein sehr häufiges
‫Szenario, das normalerweise in jeder Webanwendung
‫implementiert werden sollte, in Ordnung?
‫Also bauen wir hier eine
‫weitere Middleware-Funktion, diesmal um bestimmte Routen einzuschränken.
‫Zum Beispiel zum Löschen von Touren.
‫Das bedeutet, dass wir hier eine weitere
‫Middleware-Funktion erstellen werden.
‫Diesmal, um bestimmte Routen, wie zum Beispiel
‫das Löschen von
‫Touren, nur auf bestimmte Benutzerrollen einzuschränken.
‫Okay?
‫Lassen Sie mich Ihnen also zeigen, wie das
‫in der Praxis aussehen würde.
‫Kehren wir hier
‫in den Tourrouten zu dem Beispiel des Löschens von
‫Touren zurück und fügen wir dem Stack hier Middleware hinzu.
‫Also authController, schützen.
‫Zuerst müssen wir also
‫immer überprüfen, ob ein Benutzer tatsächlich eingeloggt ist, okay?
‫Wenn ein Administrator also versucht, eine Tour zu löschen,
‫müsste er trotzdem
‫überprüfen, ob er tatsächlich eingeloggt ist, oder?
‫Die erste Middleware im Stack wird hier
‫also immer die Protect-Middleware sein.
‫Aber danach haben wir
‫auch den authController. beschränken.
‫Also restriktiv, okay?
‫Und an diese Funktion übergeben wir dann einige Benutzerrollen,
‫die berechtigt sind, mit dieser Ressource zu interagieren.
‫In diesem Fall mit dem Löschen einer Tour, okay?
‫Also lass uns diesen auf Admin setzen.
‫Also nur an Administratoren.
‫Okay, und jetzt haben wir es hier mit Benutzerrollen zu tun.
‫Also genau wie Admin.
‫Und im Moment haben wir das nicht in unserem Benutzermodell.
‫Also lassen Sie uns das hier schnell implementieren.
‫Gut.
‫Also, lass uns das tun.
‫Eigentlich vor dem Passwort-Zeug, so wie hier.
‫Und hier unten können Sie tatsächlich sehen, wie unser
‫nicht abgefangener Ausnahmehandler gut funktioniert,
‫denn restrikto ist noch keine Funktion, oder?
‫Wir haben es noch nicht umgesetzt.
‫Ich habe es einfach benutzt, um zu zeigen,
‫was genau wir bauen werden.
‫Da liegt natürlich ein Fehler
‫vor und
‫Nodemon wartet nun darauf, dass wir den Server neu starten, okay?
‫Wie auch immer, die Rolle hier sollte
‫vom Typ String sein, und jetzt werde ich den Enum-Validator verwenden,
‫um hier nur die Angabe bestimmter Rollentypen zuzulassen.
‫Und das sind die allgemeinen, also die normalen Benutzer, also nennen wir
‫sie einfach Benutzer.
‫Dann haben wir
‫den Reiseleiter, den leitenden
‫Reiseleiter und den Administrator.
‫Also, ich rufe nur diesen Admin an, in Ordnung?
‫Und diese Benutzerrollen, die wir hier haben, sind
‫natürlich spezifisch für die Domäne der Anwendung.
‫Wenn Sie beispielsweise eine Community-Site betreiben, ist es
‫nicht sinnvoll, einen
‫Leitfaden und einen Lead-Leitfaden zu haben.
‫Stattdessen werden Sie wahrscheinlich
‫Moderatoren oder Mitwirkende oder Mitglieder haben.
‫Sie werden also immer unterschiedliche Namen
‫haben, abhängig von der Art der Anwendung, die Sie schreiben.
‫Aber in unserem Fall macht das Sinn.
‫Dann wollen wir hier auch einen Standard setzen,
‫damit wir eigentlich nicht immer
‫angeben müssen, welchen Benutzertyp wir erstellen.
‫Der Benutzer, sagen wir, der normale
‫Benutzer, wird standardmäßig erstellt.
‫Lassen Sie uns nun
‫tatsächlich die Benutzer löschen, die wir
‫bereits haben, da
‫sie keine Rollen haben und wir sie daher nicht mehr benötigen.
‫Gut.
‫Und so lassen Sie
‫uns eigentlich auch weitermachen und einige neue erstellen.
‫Also, ich melde mich hier als hello@jonas an,
‫und das wird jetzt ein normaler Benutzer sein, und jetzt konnten wir keine
‫Antwort bekommen, und das
‫liegt natürlich daran, dass wir hier diesen Fehler
‫haben, und so, lass uns sehr Entferne schnell diese Codezeile.
‫Und jetzt ist der Fehler weg.
‫Und jetzt sollte es
‫laufen, und tatsächlich haben wir jetzt
‫diesen Benutzer mit der Rolle des Benutzers, okay?
‫Das ist also unsere
‫Standardeinstellung, aber jetzt erstellen wir hier einen Administrator.
‫Und um das wirklich klar
‫zu machen, fügen wir es auch hier in die
‫E-Mail ein, und jetzt müssen wir die Rolle wirklich
‫spezifizieren und diese auf admin setzen.
‫Senden Sie das, und jetzt haben wir unseren Systemadministrator hier.
‫Cool.
‫Gehen wir also hierher zurück, setzen wir diesen Code tatsächlich wieder ein, und wir
‫werden es jetzt so gestalten, dass
‫wir tatsächlich mehrere Argumente an dieses einschränkenTo übergeben können.
‫Ich möchte also, dass der Admin Touren löschen kann, aber
‫auch einen Guide löschen kann.
‫Gut?
‫Und das fügen wir auch hier hinzu.
‫Okay?
‫Der Admin und der leitende Guide können also jetzt
‫Touren löschen, aber nicht die normalen Guides und auch nicht die normalen Benutzer.
‫Gut?
‫So wird also restrikto funktionieren, lassen Sie uns
‫jetzt fortfahren und es implementieren.
‫Also Exporte. einschränkenTo, und
‫wie wollen wir das nun konkret umsetzen?
‫Denn normalerweise können wir keine
‫Argumente an eine Middleware-Funktion übergeben, oder?
‫Aber in diesem Fall wollen wir es wirklich.
‫Wir wollen die
‫Rollen übergeben, die auf die Ressource zugreifen dürfen, oder?
‫Also in diesem Fall der Admin und der Lead Guide.
‫Wir brauchen also eine Möglichkeit, Argumente grundsätzlich auf eine
‫Weise an die Middleware-Funktion zu übergeben,
‫die normalerweise nicht funktioniert.
‫Also, wie wollen wir das machen?
‫Nun, hier werden wir tatsächlich eine
‫Wrapper-Funktion erstellen, die dann die
‫Middleware-Funktion zurückgibt, die wir eigentlich erstellen möchten, okay?
‫Dies ist also die Funktion restriktivTo, und
‫hier möchten wir eine
‫beliebige Anzahl von Argumenten übergeben.
‫Also im Grunde von Rollen.
‫Und so können wir die restliche
‫Parametersyntax verwenden, die in ES6 wieder neu ist,
‫und dies wird
‫dann ein Array aller angegebenen Argumente erstellen, okay?
‫Also erstellen wir diese
‫Funktion und geben dann sofort eine neue Funktion zurück.
‫Und das ist die Middleware-Funktion selbst.
‫Also, Anfrage, Antwort und weiter.
‫Okay?
‫Sinn ergeben?
‫Und so bekommt diese Funktion
‫hier im Grunde dann Zugriff auf den
‫Parameter dieser Rolle hier, weil es eine Schließung gibt, okay?
‫Also, nur als Kommentar hier zur
‫Erklärung, Rollen ist ein Array.
‫In diesem Fall könnte es
‫sich also beispielsweise um Admin und Lead Guide handeln, okay?
‫Wann geben wir einem Benutzer Zugriff auf eine bestimmte Route?
‫Nun, im Grunde, wenn sich seine
‫Benutzerrolle in diesem Rollen-Array befindet, das wir übergeben haben, oder?
‫Nehmen wir an, wir haben jetzt
‫den normalen Benutzer, der die Rolle einfach Benutzer hat, also
‫schreiben wir es hier.
‫Rolle ist jetzt nur Benutzer.
‫Im Grunde ist es also nicht in
‫diesem Array enthalten, und daher hat dieser Benutzer keine Berechtigung, okay?
‫Also schreiben wir das in Code.
‫Es ist eigentlich ganz einfach.
‫Also, wenn nicht Rollen. include, und okay, noch
‫einmal include ist eine sehr schöne Array-Methode, die
‫in Java Script auf allen Arrays verfügbar ist, okay?
‫Wenn dieses Rollen-Array die Rolle
‫des aktuellen Benutzers nicht
‫enthält, erteilen wir diesem Benutzer keine Berechtigung.
‫Und wo wird die Rolle des aktuellen Benutzers gespeichert?
‫Nun, erinnern wir uns an die Codezeile, die wir
‫hier tatsächlich eingefügt haben, ganz am Ende,
‫wo wir den Zugriff auf die geschützte
‫Route gewähren, speichern
‫wir den aktuellen Benutzer auf Anfrage. Nutzer.
‫Und denken Sie daran,
‫dass diese Protect-Middleware immer vor restriktiv ausgeführt wird, richtig?
‫Hier haben wir also zuerst protect
‫und dann restrikto.
‫Wenn also diese Middleware-Funktion hier ausgeführt wird, ist
‫diese bereits abgeschlossen und
‫hat den aktuellen Benutzer auf das Anforderungsobjekt gestellt.
‫Und so können wir das jetzt hier verwenden.
‫Also beantragen. Nutzer. Rolle.
‫Dort wird die Rolle gespeichert.
‫So einfach.
‫In diesem Fall erstellen wir einen neuen Fehler.
‫Also genau wie zuvor, und jetzt
‫sagen wir, dass Sie keine Berechtigung zum Ausführen dieser Aktion haben.
‫Und jetzt ein neuer Statuscode, der 403 ist.
‫Und dieser bedeutet verboten, okay?
‫Es gibt also
‫wirklich einen spezifischen http-Statuscode nur für diesen
‫Fall, also für die Autorisierung im Grunde, in Ordnung?
‫Und, naja, sonst rufen wir einfach als nächstes an.
‫Und das ist es wirklich.
‫So einfach ist es.
‫Fassen wir also kurz zusammen, was wir hier gerade gemacht haben.
‫Hier führen wir also zuerst die Protect-Middleware aus.
‫Dann beschränken Sie sich
‫auf Middleware, und nur wenn diese beiden Middlewares zur
‫nächsten übergehen, gehen wir zur Lead-Tour.
‫Im Grunde ist dieser
‫Route-Handler oder dieser Route-Controller also geschützt und
‫wird auch durch diese Middleware, die
‫wir gerade erstellt haben, eingeschränkt.
‫Dann übergeben
‫wir an diese Funktion
‫alle Rollen, die mit dieser Ressource interagieren dürfen.
‫Also, im Grunde, wer
‫darf diese Handler-Funktion ausführen, okay?
‫Also wird diese Funktion einschränkenTo dann
‫ausgeführt und gibt die Middleware-Funktion selbst zurück, okay?
‫Und diese Middleware-Funktion selbst ist eigentlich diese.
‫Es wird dann
‫aufgrund der Schließung Zugriff auf Rollen haben, okay?
‫Nehmen wir also an, dass die Rolle des aktuellen Benutzers, die
‫in req gespeichert ist, gespeichert ist. Nutzer. Rolle, oder?
‫Nehmen wir an, seine Rolle ist user,
‫und da diese Rolle nicht im Array dieser Rolle
‫enthalten ist, erhalten wir dann diesen Fehler, okay?
‫Und das ist es, was diese Rolle spielt. enthält hier Tests für, okay?
‫Aber wenn es enthalten ist,
‫gehen wir natürlich zur nächsten Middleware über.
‫Was wiederum der Routenhandler selbst ist.
‫Cool.
‫Also ich hoffe das macht Sinn.
‫Lassen Sie uns jetzt loslegen und es schnell testen.
‫Okay?
‫Im Moment haben wir
‫also dieses Token hier, das in der JTW-Variablen gespeichert ist, oder?
‫Erinnern Sie sich also an den letzten Vortrag.
‫Wir befinden uns also in
‫dieser Entwicklungsumgebung und hier ist diese Variable.
‫Also genau der, der hier unten ist.
‫Gut?
‫Wenn wir also jetzt eine
‫Tour löschen würden, müssten wir diese Variable dann dort angeben, oder?
‫Kommen wir also zur Autorisierung, dem Inhaber-Token, und
‫dann legt es ihn
‫eigentlich schon hier für uns ab.
‫Es weiß also bereits,
‫dass dies die ist, die wir verwenden möchten, weil
‫wir sie schon einmal verwendet haben, okay?
‫Nun möchte ich Ihnen zunächst zeigen,
‫dass ein normaler Benutzer eine Tour jetzt nicht löschen kann, okay?
‫Beginnen wir also damit, dass wir uns als normaler Benutzer anmelden.
‫Und das ist Hallo, oder?
‫Denken Sie daran, im Moment haben wir hello@jonas. io, das ist ein normaler Benutzer,
‫und wir haben admin@jonas. io.
‫Und wir haben immer noch dieses alte hier, lass es uns loswerden.
‫Gut.
‫Also fange ich mit hello@jonas an. io.
‫Okay?
‫Wenn Sie sich also anmelden, wird dieses Token in der
‫Umgebungsvariablen gespeichert, und jetzt können
‫wir eine Tour löschen.
‫Wir brauchen jetzt eigentlich auch noch einen Ausweis, also
‫lass uns schnell einen von hier holen,
‫also werden wir im Grunde eine unserer Touren hier löschen.
‫Also verwenden wir hier einfach den letzten.
‫Also der Sternengucker.
‫Okay?
‫Und mal sehen, ob wir unsere Fehlermeldung bekommen.
‫Und tatsächlich sind Sie nicht berechtigt, diese
‫Aktion auszuführen.
‫Also 403.
‫Es funktioniert also tatsächlich, oder?
‫Aber um dies jetzt
‫zu vervollständigen, melden wir uns natürlich als Admin an.
‫Also, Administrator.
‫Anmeldung.
‫Und so wird dieses Token nun in dieser Variable gespeichert.
‫Wenn Sie dies
‫jetzt ausführen, sollten wir die Tour effektiv löschen können.
‫Möchte sehen?
‫Und es ist weg.
‫Wir haben also einen Code von 204, keinen
‫Inhalt, was beim Löschen der Standard
‫ist, aber jetzt, wenn wir alle unsere
‫Touren bekommen, sollten wir hier jetzt eine Zahl acht
‫sehen, also nur
‫acht Ergebnisse, und das bedeutet, dass der letzte jetzt ist weg, okay?
‫Und wie wir gerade bewiesen haben,
‫hat ein Administrator im
‫Moment die Berechtigung, Touren effektiv zu löschen, okay?
‫Und ich kann wirklich nicht
‫genug betonen, wie wichtig dieser Code hier ist.
‫Also im Grunde, woher wir die Rolle des aktuellen
‫Benutzers von der Middleware vorher bekommen, okay?
‫Es ist also wirklich entscheidend, den Benutzer wie
‫hier in der Anfrage
‫zu speichern, damit dieser nächste Schritt tatsächlich funktioniert, okay?
‫Die ID, die im Jason-Webtoken codiert ist, lässt unseren Code also wissen, ob
‫der Benutzer, der die Aktion auszuführen versucht,
‫ein Benutzer ist, oder ob es sich um einen Administrator handelt, oder
‫ob es sich um einen Lead Guide oder was auch immer handelt.
‫Auch hier, weil
‫diese Daten von dieser schützenden Middleware stammen.
‫Toll.
‫Dies war ein weiteres wichtiges
‫Puzzleteil bei der Implementierung unseres Authentifizierungsworkflows hier.
‫Und natürlich möchten Sie viele
‫andere Routen einschränken, zum Beispiel hier aktualisieren, okay?
‫Aber das überlasse ich
‫einem späteren Zeitpunkt des Kurses, okay?
‫Hier wollte ich Ihnen nur
‫zeigen, wie das alles funktioniert, okay?
‫Also, ich glaube, das ist mir gelungen.
‫Ich hoffe, Sie haben verstanden, wie dies
‫funktioniert, und wenn nicht, können Sie natürlich jederzeit
‫eine Frage im offiziellen Q-und-A-Bereich stellen.
‫Wie auch immer, es kommen gerade noch einige weitere großartige Inhalte
‫und so gehen wir weiter.