国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

nodejs acl的用戶權限管理詳解

2024-05-06 15:20:40
字體:
來源:轉載
供稿:網友

說明

Q: 這個工具用來做什么的呢

A: 用戶有不同的權限,比如管理員,vip,普通用戶,每個用戶對應訪問api,頁面都不一樣

nodejs有兩個比較有名的權限管理模塊 一個是acl 一個是rbac 綜合對比了一下最終在做項目的時候選擇了acl

功能列表:

    addUserRoles //給某用戶添加角色 removeUserRoles //移除某用戶角色 userRoles //獲取某用戶所有角色 roleUsers //獲取所有是此角色的用戶 hasRole // 某用戶是否是某角色 addRoleParents //給某角色增加父角色 removeRoleParents //移除某覺得的某父角色或所有父角色 removeRole //移除某角色 removeResource //移除某資源 allow //給某些角色增加某些資源的某些權限 removeAllow //移除某些角色的某些資源的某些權限 allowedPermissions //查詢某人的所有資源及其權限 isAllowed //查詢某人是否有某資源的某權限 areAnyRolesAllowed //查詢某角色是否有某資源的某權限 whatResources //查詢某角色有哪些資源 middleware //middleware for express backend //指定方式(mongo/redis…)

ACL名詞及其主要方法

roles 角色

    removeRole addRoleParents allow removeAllow

resources 資源

    whatResources removeResource

permissions 權限

users 用戶

    allowedPermissions isAllowed addUserRoles removeUserRoles userRoles roleUsers hasRole areAnyRolesAllowed

使用方法

    建立起配置文件 用戶登錄后分配相應的權限 需要控制的地方使用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_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();    };  }            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 城市| 堆龙德庆县| 扶沟县| 洛南县| 绍兴市| 沧州市| 遵化市| 鄂尔多斯市| 桦甸市| 永兴县| 深泽县| 灌南县| 襄樊市| 自治县| 阳原县| 西藏| 鄂托克前旗| 冕宁县| 黄大仙区| 沂南县| 蓬安县| 文水县| 花垣县| 合江县| 琼海市| 图木舒克市| 松滋市| 乐山市| 阳朔县| 广元市| 阳春市| 阜平县| 康马县| 朝阳市| 文成县| 金川县| 济源市| 新民市| 黔东| 高雄县| 墨玉县|