亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

nodejs acl的用戶權限管理詳解

2024-05-06 16:43:05
字體:
來源:轉載
供稿:網友

說明

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

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

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

功能列表:

  1. addUserRoles //給某用戶添加角色
  2. removeUserRoles //移除某用戶角色
  3. userRoles //獲取某用戶所有角色
  4. roleUsers //獲取所有是此角色的用戶
  5. hasRole // 某用戶是否是某角色
  6. addRoleParents //給某角色增加父角色
  7. removeRoleParents //移除某覺得的某父角色或所有父角色
  8. removeRole //移除某角色
  9. removeResource //移除某資源
  10. allow //給某些角色增加某些資源的某些權限
  11. removeAllow //移除某些角色的某些資源的某些權限
  12. allowedPermissions //查詢某人的所有資源及其權限
  13. isAllowed //查詢某人是否有某資源的某權限
  14. areAnyRolesAllowed //查詢某角色是否有某資源的某權限
  15. whatResources //查詢某角色有哪些資源
  16. middleware //middleware for express
  17. backend //指定方式(mongo/redis…)

ACL名詞及其主要方法

roles 角色

  1. removeRole
  2. addRoleParents
  3. allow
  4. removeAllow

resources 資源

  1. whatResources
  2. removeResource

permissions 權限

users 用戶

  1. allowedPermissions
  2. isAllowed
  3. addUserRoles
  4. removeUserRoles
  5. userRoles
  6. roleUsers
  7. hasRole
  8. areAnyRolesAllowed

使用方法

  1. 建立起配置文件
  2. 用戶登錄后分配相應的權限
  3. 需要控制的地方使用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();    };  }

有點要說明的是express.Router支持導出一個Router模塊 再在app.use使用,但是如果你這樣使用 app.use('/admin/user',auth(), userRoute); 那么是在auth這個函數是獲取不到 req.route 這個屬性的。 因為acl對訪問權限做的是強匹配,所以需要有一定的容錯

登錄的權限分配

result為數據庫查詢出來的用戶信息,或者后臺api返給的用戶信息,這里的switch可以使用配置文件的形式,因為我這邊本次項目只有三個權限,所以就在這里簡單寫了一下。

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

pug頁面中的渲染邏輯控制

在 express+pug中 app.locals.auth= async function(){} 這個寫法在pug渲染的時候是不會得出最終結果的,因為pug是同步的,那么我如何控制當前頁面或者說當前頁面的按鈕用戶是否有權限展示出來, 這里通用的做法有

  1. 用戶在登錄的時候有一個路由表和組件表 然后在渲染的時候 根據這個表去渲染
  2. 在需要權限控制的地方,使用函數來判斷用戶是否有權限訪問

我這里采用的是結局方案2.因為比較方便, 但是問題來了 express+pug是不支持異步的寫法,而acl提供給我們的全是異步的, 因為時間原因,我沒有去深究里面的判斷,而是采用了一種耦合性比較高但是比較方便的判斷方法.

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_conf,查找用戶是否有當前頁面的或者按鈕的權限 因為acl_conf在加載的時候就已經被寫入內存了,所以性能消耗不會特別大。比如下面的例子。

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 拒絕

結尾

依靠acl這個組件可以快速打造一個用戶的權限管理模塊。 但是還有個問題 也急速那個app.locals.hasRole函數, 如果你使用removeAllow動態改變了用戶的權限表,那么hasRole函數就很麻煩了。 所以在這種情況下 有以下幾個解決方案

  1. 從acl源碼入手
  2. 每次渲染的時候就把數據準備好
const hasBtn1Role = hasRole(user.role, '/xxx','get');res.render('a.pug',{hasBtn1Role})

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人成网站免费播放| 欧美国产视频日韩| 日韩中文字在线| 欧美剧在线观看| 国产91精品不卡视频| 国产亚洲欧美视频| 91探花福利精品国产自产在线| 日产精品久久久一区二区福利| 成人午夜高潮视频| 亚洲精品中文字幕av| 性欧美长视频免费观看不卡| 少妇久久久久久| 久久久成人精品| 精品中文字幕视频| 精品久久久久久久久久久久| 欧美性猛交视频| 国产午夜精品免费一区二区三区| 97av视频在线| 欧美日韩国产影院| 日韩美女福利视频| 永久免费看mv网站入口亚洲| 欧美性猛交xxxx偷拍洗澡| 亚洲欧洲日产国产网站| 国产精品视频一区二区高潮| 日本午夜精品理论片a级appf发布| 日本一本a高清免费不卡| 2019中文字幕在线| 亚洲精品美女久久久| 精品高清美女精品国产区| 欧美一级黑人aaaaaaa做受| 日韩久久精品电影| 国产精品扒开腿做| 亚洲欧美日韩爽爽影院| 国产欧美一区二区三区久久人妖| 欧美成人精品一区二区| 都市激情亚洲色图| 久久精品国产成人| 日韩在线观看免费网站| 奇米一区二区三区四区久久| 色www亚洲国产张柏芝| 国产精品爱久久久久久久| 庆余年2免费日韩剧观看大牛| 97视频在线观看亚洲| 亚洲视频视频在线| 日韩精品在线视频美女| 国产精品69精品一区二区三区| 黑人精品xxx一区一二区| 欧美成aaa人片在线观看蜜臀| 亚洲成人999| 欧美视频不卡中文| 91干在线观看| 日韩av网站在线| 91成人在线观看国产| 91精品国产91久久久久久最新| 国内精品在线一区| 久久久久久久国产| 国产在线久久久| 色综合导航网站| 欧美一级黄色网| 日本成人免费在线| 奇米影视亚洲狠狠色| 高清一区二区三区日本久| 亚洲第一精品久久忘忧草社区| 国产精品美女免费| 久久久久在线观看| 中文字幕免费精品一区| 久久精品中文字幕免费mv| 久久国产加勒比精品无码| www.久久久久久.com| 久久99久久99精品中文字幕| 国产91精品网站| 国产精品av在线播放| 久久久久久午夜| 欧美在线视频观看| 欧美日韩午夜剧场| 精品亚洲一区二区三区四区五区| 一本大道香蕉久在线播放29| 136fldh精品导航福利| 91性高湖久久久久久久久_久久99| 欧美一性一乱一交一视频| 日韩欧美在线免费| 97精品国产91久久久久久| 亚洲欧美日韩国产中文专区| 操91在线视频| 欧美日韩成人在线观看| 久久久久久亚洲精品| 色偷偷偷亚洲综合网另类| 欧美性开放视频| 精品免费在线视频| 97av在线视频| 久久精品影视伊人网| 欧美成人黄色小视频| 国产91精品久久久| 97视频在线观看播放| 精品中文字幕久久久久久| 日韩一二三在线视频播| 久久久久久久网站| 97久久久久久| 久久久久久久999精品视频| 91亚洲精品久久久久久久久久久久| 亚洲最新中文字幕| 91av免费观看91av精品在线| 日韩经典中文字幕在线观看| 日韩欧美成人免费视频| 91手机视频在线观看| 亚洲成人网在线观看| 26uuu另类亚洲欧美日本一| 精品中文字幕在线观看| 久久久国产一区| 91精品国产综合久久久久久蜜臀| 国产亚洲激情视频在线| 成人在线中文字幕| 日韩成人av一区| 日韩有码片在线观看| 国产精品夜间视频香蕉| 国产精品青青在线观看爽香蕉| 国产精品第一页在线| 岛国av在线不卡| 亚洲欧美一区二区精品久久久| 尤物yw午夜国产精品视频| 国产精品一区二区三区免费视频| 久久久精品一区二区| 久久久在线观看| 欧亚精品中文字幕| 欧美日韩免费一区| 成人在线激情视频| 中文字幕九色91在线| 色综合伊人色综合网| 国产在线高清精品| 大桥未久av一区二区三区| 中文字幕日韩专区| 亚洲色图17p| www.亚洲一区| 国产一区二区三区免费视频| 色yeye香蕉凹凸一区二区av| 亚洲欧美日韩爽爽影院| 51午夜精品视频| 国产有码一区二区| 狠狠综合久久av一区二区小说| 欧美成人精品在线| 国产精品白嫩初高中害羞小美女| 国产成人精品视频| 97香蕉久久超级碰碰高清版| 国产亚洲欧洲高清一区| 国产ts一区二区| 成人观看高清在线观看免费| 日韩av一卡二卡| 91在线视频导航| 日韩视频永久免费观看| 欧美精品日韩www.p站| 国产精品1234| 国产91色在线|免| 亚洲第一男人天堂| 久久中文精品视频| 91精品视频在线| 欧美日韩亚洲激情| 欧美大秀在线观看| 日韩a**中文字幕| 欧美日韩精品在线播放| 91高潮在线观看| 日韩视频免费观看| 日韩综合视频在线观看| 久久夜色精品亚洲噜噜国产mv| 亚洲精品综合精品自拍|