Vorwort:Kürzlich stieß ich in meinem Projekt auf ein Verwaltungssystem. Ich fand die Berechtigungskonfiguration recht interessant. Ich habe den Prozess der Implementierung aufgezeichnet, um mir das Lernen und das Ordnen meiner Gedanken zu erleichtern. Einige der Gedanken sind in die Kommentare des Codes integriert: Zwei gängige Methoden zur Routing-Interception-Authentifizierung 1: Routenabfang: Fügen Sie der Route einfach Feldkennungen hinzu und implementieren Sie sie durch Routenabfang Vergleichen:Die Implementierung der Routenabfangung ist relativ einfach. Sie müssen die Seite in router.beforeEach nur anhand der Routenkonfigurationsinformationen filtern, um zu sehen, ob sie die Berechtigung hat, zur Komponente zu gelangen. Wenn die entsprechende Berechtigung nicht ausreicht, wird sie nicht zur entsprechenden Komponente gelangen. Dynamisches Routing ist relativ komplex zu implementieren und erfordert die Zusammenarbeit des Backends. Im Wesentlichen ist die Routing-Konfigurationstabelle in zwei Teile unterteilt. Wenn sich verschiedene Benutzer anmelden, wird die Routing-Konfigurationstabelle entsprechend den Berechtigungsinformationen des Benutzers herausgefiltert und der Teil, für den der Benutzer keine Berechtigung zum Hinzufügen hat, wird nicht gerendert. Es ist besser für relativ große Backend-Systeme geeignet. Hinweis: Dieser Artikel stellt hauptsächlich die Implementierung der dynamischen Routing-Authentifizierung vor Die folgenden Dateien beziehen sich normalerweise auf dynamisches Routing:
router.js Die Routing-Konfigurationstabelle von router.js kann in zwei Teile unterteilt werden: öffentliches Routing und dynamisches Berechtigungsrouting. Dynamisches Berechtigungsrouting kann auf dem Frontend platziert werden. Bei der Authentifizierung kann das Frontend das Array selbst filtern oder es kann zum Filtern auf dem Backend platziert werden. Die Idee ist dieselbe. Im Folgenden werden die auf dem Frontend platzierten Konfigurationstabellen beschrieben. exportiere standardmäßig einen neuen Router({ Routen: { Pfad: '/login', Name:'Anmelden', Komponente: aa }, { Pfad: '/home', Name: 'Heimat', Komponente:cc }, ] }) Oben sehen Sie die Routing-Konfiguration eines allgemeinen Projekts. Jetzt müssen wir eine Authentifizierung durchführen, also müssen wir die Routing-Konfigurationstabelle leicht in die folgenden zwei Arrays aufteilen: Vue von „vue“ importieren Router von „vue-router“ importieren Vue.use(Router) export const defaultRoute = [ //Array von festen Teilberechtigungen, Routen für alle Benutzer zugänglich { Pfad: '/login', Komponente: aa }, ] export const asyncRoute = [ //Dynamisch konfigurierte Routing-Tabelle, muss vor der Verarbeitung gefiltert werden { Pfad: '/Bestellung', Name: 'Bestellung', Komponente: aa, Meta:{ System: 'Bestellung' } } { Pfad: '/Rollen', Name: 'Rollen', Komponente: aa, Meta:{ System: 'Rollen' } } ] //Routing-Tabelle registrieren const createRouter = () => new Router({ // Modus: „Verlauf“, // Serviceunterstützung erforderlich scrollBehavior: () => ({ y: 0 }), Routen: konstanteRouten }) const router = createRouter() //Setze das Routing-Arbeitsblatt zurück. Diese Methode muss beim Abmelden aufgerufen werden. export function resetRouter() { const neuerRouter = createRouter() router.matcher = neuerRouter.matcher } Standardrouter exportieren Die Berechtigungsdatei permission.js wird hauptsächlich zum globalen Abfangen von Routing und zum dynamischen Filtern von Routing gemäß Benutzerberechtigungen verwendet. Dieser Teil umfasst hauptsächlich zwei Probleme: Wann soll dynamisches Routing verarbeitet werden und unter welchen Bedingungen soll Routing verarbeitet werden? Router aus „./router“ importieren Store aus „./store“ importieren import { getToken } from '@/utils/auth' // Benutzerdefinierte Kapselungsmethode für den Zugriff auf Token Route.beforeEach((to,from,next) =>{ //Holen Sie sich das Token, um festzustellen, ob der Benutzer angemeldet ist const hasToken = getToken() wenn (hatToken) { //Beurteilen, ob sich der Benutzer angemeldet hat if (to.path === "/login") { /** *Der Benutzer hat sich angemeldet, wird aber immer noch auf die Anmeldeseite umgeleitet. Dies bedeutet, dass der Benutzer den Abmeldevorgang durchgeführt hat. Hier kann also das Token gelöscht oder eine benutzerdefinierte Logik geschrieben werden. */ nächste() }anders{ /** *Hier ist der Fall, dass sich der Benutzer angemeldet oder auf die Anmeldeschaltfläche geklickt hat. Das Token wurde im lokalen Speicher gespeichert, wird aber nicht zur Anmeldung weitergeleitet. Wenn es keine Route zu /login gibt, lassen Sie es einfach los. Hier behandle ich einige Dinge, d. h., da sich der Benutzer angemeldet hat und direkt freigegeben werden kann, müssen wir vor der Freigabe hier einige logische Schritte ausführen, d. h. die Berechtigungen des Benutzers beurteilen und dann die Routen in unserer dynamisch konfigurierten Routing-Tabelle herausfiltern, die seinen Berechtigungen basierend auf den Berechtigungen des Benutzers entsprechen, und sie dann zur Verwendung in die Routing-Konfigurationstabelle einfügen. * * Dann sind zwei Probleme damit verbunden: *1: Wann soll die dynamische Weiterleitung verarbeitet werden (nach der Anmeldung, vor dem Aufrufen der Homepage, also vor *nächster) *2: Welche Bedingungen handhaben dynamisches Routing */ /** *Hier können Sie zunächst prüfen, ob die Länge der Benutzerberechtigungsliste im Store 0 beträgt. Wenn die Länge 0 beträgt, bedeutet dies, dass der Benutzer * gerade auf die Anmeldeschaltfläche geklickt hat, die Seite jedoch nicht aufgerufen hat. Zu diesem Zeitpunkt müssen Sie eine Berechtigungsfilterung durchführen. *Wenn die Länge nicht 0 ist, bedeutet dies, dass der Authentifizierungsprozess in Ordnung ist. Gehen Sie einfach direkt zur entsprechenden Komponente. *Dieser Schritt dient hauptsächlich dazu, wiederholtes Filtern des Arrays zu verhindern und Leistung zu sparen. */ wenn (store.getters.roles.length > 0) { nächste() }anders{ //Wenn der Code diesen Punkt erreicht, bedeutet dies, dass der Benutzer angemeldet ist. Und der Authentifizierungsprozess wurde noch nicht gestartet. //Dann müssen Sie hier den Authentifizierungsprozess durchlaufen store.dispatch('getRoles').then(res=>{ //Die Res ist hier die Auflösung im Peomise im dritten Schritt //welches das Array mit den Berechtigungsinformationen ist store.dispatch('createRouters',res.data) .dann(res=>{ //Dies ist die Funktion, die den Store aufruft, um dynamische Routen zu erstellen. Sie können das //Berechtigungsarray an diese Funktion oder hier übergeben. //Diese Funktion ruft auf die gleiche Weise direkt den Wert der Rollen in Ihrem Status ab. let addRouters = store.getters('addRouters') let alleRouter = store.getters('alleRouter') //Fügen Sie den dynamischen Routing-Teil zur Arbeitsroute hinzu router.addRoutes(accessRoutes) //Zur abgefangenen Seite gehen next({ ...to, replace: true }) }) }) } } } anders { /**Hier wird die Situation behandelt, in der kein Token vorhanden ist, d. h. der Benutzer hat sich zu diesem Zeitpunkt nicht angemeldet. Wenn kein Benutzer angemeldet ist, bestimmen Sie, ob der Benutzer zur Anmeldeseite geht. Wenn es die Anmeldeseite ist, lassen Sie ihn direkt gehen. Wenn der Benutzer die Homepage besuchen möchte, ohne sich anzumelden, lassen Sie ihn auf die Anmeldeseite umleiten. wenn (zu.Pfad == '/login') { // Dieser Ort kann genauer beurteilt werden. Es ist nicht notwendig, ihn direkt beim Anmelden gehen zu lassen, aber // Wenn Sie zu allen öffentlichen Komponenten gehen, lassen Sie ihn direkt weitergehen () }anders{ weiter('/Anmelden') } } })
store.js //Definieren Sie eine Schnittstelle zum Abrufen der Benutzerberechtigungen im API-Ordner und rufen Sie sie in diesen Aktionen auf: import { getUserRole } from "../api/getRoles" //Schnittstelle zum Abrufen von Berechtigungen import { logout } from '../api/user' //Schnittstelle zum Abmelden des Benutzers import { resetRouter } from './router' importiere { removeToken } von '@/utils/auth' // Benutzerdefinierte Kapselungsmethode zum Löschen des Tokens //Dies ist eine Methode zum Filtern von Arrays. Wenn die Routing-Tabelle in mehreren Ebenen verschachtelt ist, können Sie diese Methode rekursiv aufrufen, um das Array zu filtern //function hasPermission(roles, route) { // wenn (route.meta && route.meta.roles) { // returniere roles.some(role => route.meta.roles.includes(role)) // } anders { // gibt true zurück // } //} //Exportfunktion filterAsyncRoutes(Routen, Rollen) { // const res = [] // Routen.fürJedes(Route => { // const tmp = { ...route } // wenn (hasPermission(roles, tmp)) { // wenn (tmp.Kinder) { // tmp.children = filterAsyncRoutes(tmp.children, Rollen) // } // res.push(tmp) // } // }) // // Rückgabewert //} //Standardrouting und dynamisches Routing einführen import { defaultRoute , asyncRouter } from '@/router' konstanter Zustand = { Rollen: [] // Die von der Schnittstelle erhaltene Berechtigungsliste, vorausgesetzt, das Datenformat ist: ["Reihenfolge", "Rollen"], allRouters: [], //Dies ist die endgültige Arbeitsroute nach der gesamten Integration addRouters: [], //Dies ist die Route, die entsprechend der dynamischen Berechtigungsübereinstimmung herausgefiltert wird} const getter = { /**Speichern Sie die Rollen im Status in diesem Getter und rufen Sie dann die Rollen an anderen Stellen in diesem Getter ab. Wenn sich die ursprünglichen Rollen ändern, ändern sich auch die Rollen an anderen Stellen, was berechneten Eigenschaften entspricht */ Rollen:Zustand => Zustand.Rollen alleRouter:Zustand => Zustand.alleRouter addRouters:state => zustand.addRouters } const-Mutationen: { /**Senden Sie in den folgenden Aktionen das Array mit den Berechtigungsinformationen per Commit an diese Stelle. Anschließend *sendet diese Stelle das Array an die Statusrollen. */ SetRoute(Status, Router) //Der Router ist hier die nach Benutzerberechtigungen gefilterte Routing-Tabelle state.allRouters = defaultRoute.concat(router) state.addRouters = Router } //Speichern Sie das Routing-Berechtigungs-Array im Status setRoles(Status,Wert){ Status.Rollen = Wert } } const-Aktionen: { //Schreiben Sie eine Anfrage, um die Berechtigungen der aktuell angemeldeten Rolle zu erhalten, z. B. ["/order","roles"]. Wenn die Anfrage // so zurückkommt, bedeutet dies, dass die Berechtigungen dieser Rolle darin bestehen, auf die Bestellroute und //Rollenroute zuzugreifen // Es gibt zwei mögliche Situationen zum Abrufen von Berechtigungsinformationen: mit Ausnahme der folgenden Berechtigungsinformationen, bei denen es sich um eine separate Schnittstelle handelt. //Berechtigungsinformationen können auch zusammen mit der Benutzeranmeldeschnittstelle zurückgegeben werden //Holen Sie sich die Berechtigungsinformationen des aktuellen Benutzers und speichern Sie sie im Status. Diese Berechtigungsinformationen können mit dem Backend // kommuniziert werden. Sie werden nicht als separate Schnittstelle geschrieben, die Sie anfordern können. Stattdessen werden Ihnen beim Anmelden die Benutzerinformationen und die Berechtigungsinformationen des Benutzers auf einmal zurückgegeben. Wenn sich der Benutzer dann anmeldet, werden die Berechtigungsinformationen im Status gespeichert. //Der Zweck besteht darin, das Array der Berechtigungsinformationen im Status zu speichern. //Rollenberechtigungsmethode abrufen getRoles({commit},data){ returniere neues Promise(lösen,ablehnen){ //Aufruf zum Abrufen der Benutzerrechte-Schnittstelle getUserRole().then(res =>{ //Die hier zurückgegebenen Daten sollten ein Array mit Berechtigungsinformationen sein, wie etwa: ["order", "roles"] //Speichern Sie die Berechtigungsinformationen durch Mutationen im Status commit('Rollen festlegen',res.data) auflösen(res.data) }) } }) //Methode zum Filtern der Array-Konfigurationstabelle basierend auf Berechtigungen createRouters({ commit } , data ){ returniere neues Promise((lösen,ablehnen) => { let addRouters = [ ] wenn (data.includes("admin") { addRouters = asyncRouter }anders{ // Bei der Projektentwicklung kann das Routing-Array in mehreren Ebenen verschachtelt sein, daher muss an dieser Stelle die oben beschriebene benutzerdefinierte Methode verwendet werden //Methode zum rekursiven Filtern, diese Demo verarbeitet nur eine Ebene des Arrays //(filterAsyncRoutes) method addRouters = asyncRouter.filter(item=>{ wenn (Daten.enthält(Element.Meta.System)) { Rücksendeartikel } }) } //Übergeben Sie die passende Berechtigungsroute an Mutationen und lassen Sie Mutationen //Speichern Sie die übereinstimmende Route im Status commit.("Route festlegen",Router hinzufügen) resolve() //Hier müssen Sie resolve aufrufen, damit Außenstehende den Rückruf der erfolgreichen Array-Filterung durch //.then }) erhalten können. }, Abmelden({ Commit }) { returniere neues Promise((lösen, ablehnen) => { abmelden().dann(() => { removeToken() // muss zuerst das Token entfernen Router zurücksetzen() commit('Rollen festlegen', []) commit('Route festlegen', []) lösen() }).fangen(Fehler => { ablehnen(Fehler) }) }) }, } Standard exportieren { Zustand, Getter, Mutationen, Aktionen } Abmelden: asynchrone Funktion logout(){ versuchen{ const res = warte auf store.dispatch.logout() wenn(res.code == 200){ //Abmeldung erfolgreich } }fangen{ //Abmeldung fehlgeschlagen (Fehler) } } Ende:Es gibt viel Code, aber die Idee ist sehr einfach: Es geht nur darum, die Routing-Konfigurationstabelle abzurufen, das Array zu filtern und es dynamisch hinzuzufügen Projektreferenz GitHub: vue-element-admin Dies ist das Ende dieses Artikels über die Analyse des Hintergrundauthentifizierungsprozesses von Vue-Elementen. Weitere relevante Inhalte zur Vue-Element-Authentifizierung finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Zwei Möglichkeiten zum Zurücksetzen des Root-Passworts einer MySQL-Datenbank mit lnmp
>>: Detaillierte Analyse des Linux-Kernel-Makros container_of
Vorwort Ich glaube, jeder weiß, dass Indizes geor...
Inhaltsverzeichnis 1. Verwendung von Keep-Alive A...
Nach der Installation von Navicat Der folgende Fe...
Der erste Schritt besteht darin, eine Software zur...
Horizontale Linie Verwenden Sie das Tag <hr /&...
Inhaltsverzeichnis Vorwort Installieren des Grafi...
In diesem Artikel wird der spezifische Code für C...
Wenn Sie MySQL zum ersten Mal lernen, verstehen S...
Beginnen wir mit einer Beschreibung des Problems:...
Das Image kann auf hub.docker.com gespeichert wer...
Dies scheint mit der neuen Version nicht mehr mög...
Best Practices für die Web-Frontend-Optimierung: ...
vmware vsphere 6.5 ist die klassische Version der...
MySQL ist ein kleines relationales Open-Source-Da...
Inhaltsverzeichnis 1. Was ist der Lebenszyklus 2....