Heim  >  Artikel  >  Web-Frontend  >  Ausführliche Erläuterung der Benutzerrechteverwaltung von NodeJS ACL

Ausführliche Erläuterung der Benutzerrechteverwaltung von NodeJS ACL

亚连
亚连Original
2018-05-30 11:13:362744Durchsuche

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:

  1. addUserRoles //Eine Rolle zu einem Benutzer hinzufügen

  2. removeUserRoles / /Eine bestimmte Benutzerrolle entfernen

  3. userRoles //Alle Rollen eines bestimmten Benutzers abrufen

  4. roleUsers //Alle Benutzer mit dieser Rolle abrufen

  5. hasRole // Ob ein Benutzer eine bestimmte Rolle hat

  6. addRoleParents //Eine übergeordnete Rolle zu einer bestimmten Rolle hinzufügen

  7. removeRoleParents //Eine bestimmte übergeordnete Rolle oder alle übergeordneten Rollen einer bestimmten Person entfernen

  8. removeRole //Eine bestimmte Rolle entfernen

  9. removeResource //Eine bestimmte Ressource entfernen

  10. allow //Bestimmte Berechtigungen für bestimmte Ressourcen zu bestimmten Rollen hinzufügen

  11. removeAllow //Entfernen bestimmte Berechtigungen für bestimmte Rollen Bestimmte Berechtigungen für bestimmte Ressourcen

  12. allowedPermissions //Alle Ressourcen und Berechtigungen von jemandem abfragen

  13. isAllowed //Abfragen, ob jemand ist Eine bestimmte Berechtigung für eine bestimmte Ressource haben

  14. areAnyRolesAllowed //Abfragen, ob eine Rolle eine bestimmte Berechtigung für eine bestimmte Ressource hat

  15. whatResources / /Abfragen, ob eine Rolle eine bestimmte Berechtigung hat Welche Ressourcen

  16. Middleware //Middleware für Express

  17. Backend //Spezifikationsmethode (mongo/redis ...)

ACL-Substantive und ihre Hauptmethoden

Rollen Rollen

  1. removeRole

  2. addRoleParents

  3. allow

  4. removeAllow

Ressourcen Ressourcen

  1. whatResources

  2. removeResource

Berechtigungen Berechtigungen

Benutzer Benutzer

  1. allowedPermissions

  2. isAllowed

  3. addUserRoles

  4. removeUserRoles

  5. userRoles

  6. roleUsers

  7. hasRole

  8. areAnyRolesAllowed

Verwendung

  1. Eine Konfigurationsdatei erstellen

  2. Weisen Sie entsprechende Berechtigungen zu, nachdem sich der Benutzer angemeldet hat

  3. 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

  1. Wenn sich der Benutzer anmeldet, hat er eine Routing-Tabelle und eine Komponententabelle und rendert dann beim Rendern gemäß dieser Tabelle

  2. 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:

  1. Beginnen Sie mit dem ACL-Quellcode

  2. Bereiten Sie die Daten bei jedem Rendern vor

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

AngularJS-Implementierung zwischen Controllern Zusammenfassung von Beispiele für Kommunikationsmethoden

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn