最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

nodejs acl的用戶權限管理詳解

 更新時間:2018年03月14日 14:39:39   作者:relsoul  
這篇文章主要介紹了nodejs acl的用戶權限管理詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

說明

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

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

nodejs有兩個比較有名的權限管理模塊 一個是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_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'] },
    ]
  }
];

校檢

這里是結合express做校檢...結果發(fā)現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對應不上 則繼續(xù)找.
      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動態(tài)改變了用戶的權限表,那么hasRole函數就很麻煩了。 所以在這種情況下 有以下幾個解決方案

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

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

相關文章

  • 淺析Node.js查找字符串功能

    淺析Node.js查找字符串功能

    今天做項目的時候需要的一個問題,想查找一個字符串,但是忘記了,具體在那個文件里了,于是就想起來了node.js,毫無壓力的找到了這個字符串,分享給大家
    2014-09-09
  • node.js使用cluster實現多進程

    node.js使用cluster實現多進程

    本文給大家詳細介紹了nodejs使用cluster模塊實現多進程的方法和步奏,非常的細致全面,有需要的小伙伴可以參考下
    2016-03-03
  • node.js項目如何創(chuàng)建websocket模塊

    node.js項目如何創(chuàng)建websocket模塊

    這篇文章主要介紹了node.js項目如何創(chuàng)建websocket模塊問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • 使用Express+Node.js對mysql進行增改查操作?

    使用Express+Node.js對mysql進行增改查操作?

    這篇文章主要介紹了使用Express+Node.js對mysql進行增改查操作,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Node.js net模塊功能及事件監(jiān)聽用法分析

    Node.js net模塊功能及事件監(jiān)聽用法分析

    這篇文章主要介紹了Node.js net模塊功能及事件監(jiān)聽用法,結合實例形式分析了net模塊功能及事件監(jiān)聽相關操作技巧,需要的朋友可以參考下
    2019-01-01
  • Node.js本地文件操作之文件拷貝與目錄遍歷的方法

    Node.js本地文件操作之文件拷貝與目錄遍歷的方法

    這篇文章主要介紹了Node.js本地文件操作之文件拷貝與目錄遍歷的方法,拷貝用到了Node的文件API,遍歷則舉了一個異步API實現的形式(Node的一大特點),需要的朋友可以參考下
    2016-02-02
  • 如何使用npm安裝yarn詳解

    如何使用npm安裝yarn詳解

    Yarn是一個新的快速安全可信賴的可以替代NPM的依賴管理工具,下面這篇文章主要給大家介紹了關于如何使用npm安裝yarn的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Nodejs多站點切換Htpps協議詳解及簡單實例

    Nodejs多站點切換Htpps協議詳解及簡單實例

    這篇文章主要介紹了Nodejs多站點切換Htpps協議詳解及簡單實例的相關資料,需要的朋友可以參考下
    2017-02-02
  • node.js中cluster的使用教程

    node.js中cluster的使用教程

    這篇文章主要介紹了node.js中cluster的使用教程,分別介紹使用NODE中cluster利用多核CPU、通過消息傳遞來監(jiān)控工作進程狀態(tài)以及終止進程等功能,給出了詳細的示例代碼供大家參考學習,需要的朋友們下面來一起看看吧
    2017-06-06
  • Nest.js散列與加密實例詳解

    Nest.js散列與加密實例詳解

    這篇文章主要給大家介紹了關于Nest.js散列與加密的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02

最新評論

塔河县| 延庆县| 司法| 肇源县| 桑日县| 伽师县| 永新县| 天台县| 巴彦县| 渑池县| 新竹县| 迭部县| 日照市| 犍为县| 枝江市| 宽甸| 青铜峡市| 偃师市| 辰溪县| 德江县| 邹城市| 江北区| 汝阳县| 玉环县| 定州市| 措美县| 灌阳县| 泰和县| 来宾市| 定南县| 三江| 旬阳县| 龙州县| 昌邑市| 扎囊县| 临颍县| 苏尼特右旗| 贵定县| 留坝县| 隆德县| 延安市|