說明
Q: 這個工具用來做什么的呢
A: 用戶有不同的權限,比如管理員,vip,普通用戶,每個用戶對應訪問api,頁面都不一樣
nodejs有兩個比較有名的權限管理模塊 一個是acl 一個是rbac 綜合對比了一下最終在做項目的時候選擇了acl
功能列表:
ACL名詞及其主要方法
roles 角色
resources 資源
permissions 權限
users 用戶
使用方法
配置文件
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_confmodule.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'] }, ] }];校檢
這里是結合express做校檢...結果發現acl自己提供的中間件太雞肋了,這里就重寫了一個。
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(); }; }
新聞熱點
疑難解答
圖片精選