Heim > Artikel > Web-Frontend > Ausführliche Erläuterung der Benutzerrechteverwaltung von NodeJS ACL
Dieser Artikel stellt hauptsächlich die detaillierte Erklärung der Benutzerrechteverwaltung von nodejs acl vor. Jetzt teile ich ihn mit Ihnen und gebe ihn als Referenz.
Anleitung
F: Wofür wird dieses Tool verwendet?
A: Benutzer haben unterschiedliche Berechtigungen, z. B. Administrator, VIP, normale Benutzer, Jeder Benutzer greift auf die API zu und die Seite ist anders
Nodejs verfügt über zwei bekannte Berechtigungsverwaltungsmodule, eines ist acl und das andere ist rbac. Nach einem umfassenden Vergleich habe ich mich bei der Arbeit am Projekt schließlich für acl entschieden
Funktionsliste:
addUserRoles //Eine Rolle zu einem Benutzer hinzufügen
removeUserRoles / /Eine bestimmte Benutzerrolle entfernen
userRoles //Alle Rollen eines bestimmten Benutzers abrufen
roleUsers //Alle Benutzer mit dieser Rolle abrufen
hasRole // Ob ein Benutzer eine bestimmte Rolle hat
addRoleParents //Eine übergeordnete Rolle zu einer bestimmten Rolle hinzufügen
removeRoleParents //Eine bestimmte übergeordnete Rolle oder alle übergeordneten Rollen einer bestimmten Person entfernen
removeRole //Eine bestimmte Rolle entfernen
removeResource //Eine bestimmte Ressource entfernen
allow //Bestimmte Berechtigungen für bestimmte Ressourcen zu bestimmten Rollen hinzufügen
removeAllow //Entfernen bestimmte Berechtigungen für bestimmte Rollen Bestimmte Berechtigungen für bestimmte Ressourcen
allowedPermissions //Alle Ressourcen und Berechtigungen von jemandem abfragen
isAllowed //Abfragen, ob jemand ist Eine bestimmte Berechtigung für eine bestimmte Ressource haben
areAnyRolesAllowed //Abfragen, ob eine Rolle eine bestimmte Berechtigung für eine bestimmte Ressource hat
whatResources / /Abfragen, ob eine Rolle eine bestimmte Berechtigung hat Welche Ressourcen
Middleware //Middleware für Express
Backend //Spezifikationsmethode (mongo/redis ...)
ACL-Substantive und ihre Hauptmethoden
Rollen Rollen
removeRole
addRoleParents
allow
removeAllow
Ressourcen Ressourcen
whatResources
removeResource
Berechtigungen Berechtigungen
Benutzer Benutzer
allowedPermissions
isAllowed
addUserRoles
removeUserRoles
userRoles
roleUsers
hasRole
areAnyRolesAllowed
Verwendung
Eine Konfigurationsdatei erstellen
Weisen Sie entsprechende Berechtigungen zu, nachdem sich der Benutzer angemeldet hat
Verwenden Sie acl zur Überprüfung, wenn Kontrolle erforderlich ist
Konfigurationsdatei
const Acl = require('acl'); const aclConfig = require('../conf/acl_conf'); module.exports = function (app, express) { const acl = new Acl(new Acl.memoryBackend()); // eslint-disable-line acl.allow(aclConfig); return acl; }; // acl_conf module.exports = [ { roles: 'normal', // 一般用户 allows: [ { resources: ['/admin/reserve'], permissions: ['get'] }, ] }, { roles: 'member', // 会员 allows: [ { resources: ['/admin/reserve', '/admin/sign'], permissions: ['get'] }, { resources: ['/admin/reserve/add-visitor', '/admin/reserve/add-visitor-excel', '/admin/reserve/audit', '/admin/sign/ban'], permissions: ['post'] }, ] }, { roles: 'admin', // 管理 allows: [ { resources: ['/admin/reserve', '/admin/sign', '/admin/set'], permissions: ['get'] }, { resources: ['/admin/set/add-user', '/admin/set/modify-user'], permissions: ['post'] }, ] }, { roles: 'root', // 最高权限 allows: [ { resources: ['/admin/reserve', '/admin/sign', '/admin/set'], permissions: ['get'] }, ] } ];
Korrekturlesen
Dies ist ein Korrekturlesen kombiniert mit Express... Es stellte sich heraus, dass die von acl selbst bereitgestellte Middleware zu nutzlos war, also habe ich habe hier eins umgeschrieben.
function auth() { return async function (req, res, next) { let resource = req.baseUrl; if (req.route) { // 正常在control中使用有route属性 但是使用app.use则不会有 resource = resource + req.route.path; } console.log('resource', resource); // 容错 如果访问的是 /admin/sign/ 后面为 /符号认定也为过 if (resource[resource.length - 1] === '/') { resource = resource.slice(0, -1); } let role = await acl.hasRole(req.session.userName, 'root'); if (role) { return next(); } let result = await acl.isAllowed(req.session.userName, resource, req.method.toLowerCase()); // if (!result) { // let err = { // errorCode: 401, // message: '用户未授权访问', // }; // return res.status(401).send(err.message); // } next(); }; }
Zu beachten ist, dass express.Router das Exportieren eines Router-Moduls und dessen anschließende Verwendung in app.use unterstützt, aber wenn Sie app.use( '/ admin/user',auth(), userRoute); Dann kann das req.route-Attribut nicht in der Auth-Funktion abgerufen werden. Da ACL eine starke Übereinstimmung mit Zugriffsberechtigungen durchführt, muss es eine bestimmte Fehlertoleranz aufweisen.
Anmeldeberechtigungszuweisung
Ergebnis ist, dass die Benutzerinformationen aus der Datenbank abgefragt werden, oder Hintergrund: Die von der API zurückgegebenen Benutzerinformationen können hier in Form einer Konfigurationsdatei für den Switch verwendet werden. Da ich für dieses Projekt nur drei Berechtigungen habe, werde ich sie hier kurz schreiben.
let roleName = 'normal'; switch (result.result.privilege) { case 0: roleName = 'admin'; break; case 1: roleName = 'normal'; break; case 2: roleName = 'member'; break; } if (result.result.name === 'Nathan') { roleName = 'root'; } req.session['role'] = roleName; // req.session['role'] = 'root'; // test acl.addUserRoles(result.result.name, roleName); // acl.addUserRoles(result.result.name, 'root'); // test
Logiksteuerung auf der Pug-Seite rendern
app.locals.auth= async in express+pug Diese Methode Das Schreiben von function(){} führt beim Rendern von pug nicht zum Endergebnis, da pug synchron ist. Wie kann ich also steuern, ob die aktuelle Seite oder die Schaltfläche der aktuellen Seite die Berechtigung hat, vom Benutzer angezeigt zu werden? Ansatz hier ist Es gibt
Wenn sich der Benutzer anmeldet, hat er eine Routing-Tabelle und eine Komponententabelle und rendert dann beim Rendern gemäß dieser Tabelle
Erfordert Berechtigungen. Verwenden Sie im Kontrollbereich Funktionen, um festzustellen, ob der Benutzer Zugriffsberechtigungen hat.
Ich verwende den Endplan 2. Weil er bequemer ist, aber das Problem besteht dass express+pug keine asynchrone Schreibmethode unterstützt, und was acl uns bietet, ist alles asynchron. Aus Zeitgründen habe ich mich nicht intensiv mit der Beurteilung befasst, sondern eine Beurteilungsmethode übernommen, die stark gekoppelt, aber bequemer ist
app.locals.hasRole = function (userRole, path, method = 'get') { if (userRole === 'root') { return true; } const current = aclConf.find((n) => { return n['roles'] === userRole; }); let isFind = false; for (let i of current.allows) { const currentPath = i.resources; // 目前数组第一个为单纯的get路由 isFind = currentPath.includes(path); if (isFind) { // 如果找到包含该路径 并且method也对应得上 那么则通过 if (i.permissions.includes(method)) { break; } // 如果找到该路径 但是method对应不上 则继续找. continue; } } return isFind; };Die obige Codepage ist relativ einfach. Sie durchläuft acl_conf, um herauszufinden, ob der Benutzer Berechtigungen für die aktuelle Seite oder Schaltfläche hat Beim Laden des Speichers ist der Leistungsverbrauch sehr gering. Wie das folgende Beispiel.
if hasRole(user.role, '/admin/reserve/audit', 'post') .col.l3.right-align a.waves-effect.waves-light.btn.margin-right.blue.font12.js-reviewe-ok 同意 a.waves-effect.waves-light.btn.pink.accent-3.font12.js-reviewe-no 拒绝
Ende
Anhand der ACL-Komponente können Sie schnell ein Benutzerrechteverwaltungsmodul erstellen. Es gibt jedoch immer noch ein Problem, nämlich die Funktion app.locals.hasRole. Wenn Sie RemoveAllow verwenden, um die Berechtigungstabelle des Benutzers dynamisch zu ändern, ist die Funktion hasRole sehr problematisch. In diesem Fall gibt es also mehrere Lösungen:const hasBtn1Role = hasRole(user.role, '/xxx','get'); res.render('a.pug',{hasBtn1Role})
Das Obige habe ich für Sie zusammengestellt und hoffe, dass es Ihnen in Zukunft hilfreich sein wird.
Verwandte Artikel:
So verwenden Sie das Better-Scroll-Plug-in in Angular_AngularJS
JavaScript-Code implementiert die Upload-Vorschaufunktion von TXT-Dateien
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Benutzerrechteverwaltung von NodeJS ACL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!