ホームページ  >  記事  >  ウェブフロントエンド  >  Nodejs ACLのユーザー権限管理の詳細説明

Nodejs ACLのユーザー権限管理の詳細説明

亚连
亚连オリジナル
2018-05-30 11:13:362717ブラウズ

この記事では主にnodejs aclのユーザー権限管理の詳細な説明を紹介し、参考として提供します。

説明

Q: このツールは何に使用されますか?

A: ユーザーには管理者、VIP、一般ユーザーなどの異なる権限があり、各ユーザーが API にアクセスし、ページも異なります

nodejs があります。 2 つのよく知られた権限管理モジュール、1 つは acl で、もう 1 つは rbac です。包括的な比較を行った結果、プロジェクトの作業時に最終的に acl を選択しました:

addUserRoles // ユーザーにロールを追加します

  1. removeUserRoles //ユーザーロールを削除します

  2. userRoles //ユーザーのすべてのロールを取得します

  3. roleUsers //このロールを持つすべてのユーザーを取得します

  4. hasRole //ユーザーが特定のロールであるかどうか

    AdddroleParents //親の役割を役割に追加するRemoveroLeparents //特定の親の役割またはすべての親の役割を削除//役割を削除する
  5. allow //特定のリソースに対する特定の権限を特定のロールに追加します
  6. removeAllow //特定のリソースに対する特定の権限を特定のロールから削除します
  7. allowedPermissions //特定のリソースをクエリします ユーザーのすべてのリソースと権限
  8. isAllowed //誰かが特定のリソースに対して特定の権限を持っているかどうかを問い合わせる
  9. areAnyRolesAllowed //特定のロールが特定のリソースに対して特定の権限を持っているかどうかを問い合わせる
  10. whatResources //特定の人を問い合わせるリソースにはロールがありますか
  11. middleware //express用ミドルウェア
  12. backend //仕様メソッド(mongo/redis...)
  13. ACL名詞とその主なメソッド
  14. rolesロール
  15. removeRole
  16. addRoleParents
  17. allow

removeAllow

resources リソース
  1. whatResources
  2. removeResource
  3. permissions 権限
  4. users users

allowedPermissions

  1. は許可されています

  2. ユーザーロールを追加

ユーザーロール

ロールユーザー
  1. はR ole
  2. areAnyRolesAllowed
  3. 使い方
  4. 設定ファイルを作成する
  5. ユーザーがログインすると、対応する権限が割り当てられます
  6. 制御が必要な校正には ACL を使用します
  7. 設定ファイル
  8. proofcheck

こちらの結果です校正とエクスプレスを組み合わせた... acl が提供するミドルウェア自体があまりにも役に立たないことがわかったので、ここで書き直しました。

  1. 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'] },
        ]
      }
    ];

  2. 1 つ注意すべき点は、express.Router は Router モジュールのエクスポートと app.use での使用をサポートしていますが、app.use('/admin/user',auth(), userRoute を使用する場合) ); この場合、auth 関数で req.route 属性を取得できません。 ACL はアクセス許可を強力に照合するため、
  3. ログイン許可の割り当て
  4. 結果は、データベースからクエリされたユーザー情報、またはバックグラウンド API によって返されたユーザー情報です。ここで使用できる構成ファイルの形式は、このプロジェクトに対して 3 つの権限しか持っていないため、単純にここに記述しました。

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();
    };
  }

pug ページのレンダリング ロジック制御

express+pug app.locals.auth= async function(){} では、pug が同期しているため、この書き込みメソッドは pug レンダリング時に最終結果を取得しませんでは、現在のページまたは現在のページのボタンにユーザーがそれを表示する権限があるかどうかを制御するにはどうすればよいですか? ここでの一般的な方法は次のとおりです。 ユーザーがログインすると、ルーティング テーブルとコンポーネント テーブルが作成されます。この表に従ってレンダリングする場合

権限制御が必要な箇所では、関数を使用してユーザーにアクセス権限があるかどうかを判断します

私は終了案2を使用しています。しかし問題は、express+ Pug が非同期書き込みをサポートしていないことと、ACL が提供するものはすべて非同期であることです。時間の都合上、内部の判定については詳しく説明しませんでしたが、結合性が高く、より便利な判定方法を採用しました。

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

上記のコード ページは、 acl_conf を走査して、ユーザーが現在のページまたはボタンに対する権限を持っているかどうかを確認します。 acl_conf はロード時にすでにメモリに書き込まれているため、パフォーマンスの消費は特に大きくありません。大きい。以下の例のように。

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;
};

終わり

acl コンポーネントを利用すると、ユーザー権利管理モジュールをすばやく作成できます。 ただし、app.locals.hasRole 関数が問題になります。removeAllow を使用してユーザーの権限テーブルを動的に変更する場合、hasRole 関数は非常に面倒になります。 したがって、この場合、いくつかの解決策があります。 acl ソース コードから始めて、レンダリングするたびにデータを準備します。

上記は私が皆さんのためにまとめたものであり、今後皆さんのお役に立てば幸いです。

関連記事:

Angular_AngularJSのベタースクロールプラグインの使い方

Angularjsでコントローラー間の通信を実装する例のまとめ

txtのアップロードプレビュー機能を実装するJavaScriptコードファイル

以上がNodejs ACLのユーザー権限管理の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。