この記事では主にnodejs aclのユーザー権限管理の詳細な説明を紹介し、参考として提供します。
説明
Q: このツールは何に使用されますか?
A: ユーザーには管理者、VIP、一般ユーザーなどの異なる権限があり、各ユーザーが API にアクセスし、ページも異なります
nodejs があります。 2 つのよく知られた権限管理モジュール、1 つは acl で、もう 1 つは rbac です。包括的な比較を行った結果、プロジェクトの作業時に最終的に acl を選択しました:
addUserRoles // ユーザーにロールを追加します
removeUserRoles //ユーザーロールを削除します
userRoles //ユーザーのすべてのロールを取得します
roleUsers //このロールを持つすべてのユーザーを取得します
hasRole //ユーザーが特定のロールであるかどうか
AdddroleParents //親の役割を役割に追加するRemoveroLeparents //特定の親の役割またはすべての親の役割を削除//役割を削除するremoveAllow
resources リソースusers users
allowedPermissions
は許可されています
ユーザーロールを追加
ユーザーロール
こちらの結果です校正とエクスプレスを組み合わせた... acl が提供するミドルウェア自体があまりにも役に立たないことがわかったので、ここで書き直しました。
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'] }, ] } ];
結果は、データベースからクエリされたユーザー情報、またはバックグラウンド 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(); }; }
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 サイトの他の関連記事を参照してください。