nodejs acl的用户权限管理详解

这篇文章主要介绍了nodejs acl的用户权限管理详解,现在分享给大家,也给大家做个参考。

说明

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();    };  }

登录后复制

有点要说明的是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是同步的,那么我如何控制当前页面或者说当前页面的按钮用户是否有权限展示出来, 这里通用的做法有

用户在登录的时候有一个路由表和组件表 然后在渲染的时候 根据这个表去渲染

在需要权限控制的地方,使用函数来判断用户是否有权限访问

我这里采用的是结局方案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函数就很麻烦了。 所以在这种情况下 有以下几个解决方案

从acl源码入手

每次渲染的时候就把数据准备好

const hasBtn1Role = hasRole(user.role, '/xxx','get');res.render('a.pug',{hasBtn1Role})

登录后复制

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

Angular中使用better-scroll插件的方法_AngularJS

Angular中使用better-scroll插件的方法_AngularJS

Angular中使用better-scroll插件的方法_AngularJS

以上就是nodejs acl的用户权限管理详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2753759.html

(0)
上一篇 2025年3月8日 06:46:09
下一篇 2025年3月8日 06:46:14

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 如何操作JS实现下拉框联动

    这次给大家带来如何操作JS实现下拉框联动,操作JS实现下拉框联动的注意事项有哪些,下面就是实战案例,一起来看一下。 JS下拉联动function setSecond(obj){ var val = obj.value; if(val == …

    编程技术 2025年3月8日
    000
  • 使用JS进行对table表格内列内容即时搜索筛选

    这次给大家带来使用JS进行对table表格内列内容即时搜索筛选,使用JS进行对table表格内列内容即时搜索筛选的注意事项有哪些,下面就是实战案例,一起来看一下。 往往有些时候,我们把数据从数据库读取出来,显示到table里面,而此时来了个…

    2025年3月8日
    200
  • 怎样操作Node.js 使用jade模板引擎

    这次给大家带来怎样操作Node.js 使用jade模板引擎,操作Node.js 使用jade模板引擎的注意事项有哪些,下面就是实战案例,一起来看一下。 在“Node.js开发入门——Express安装与使用”里,我们曾经使用express …

    2025年3月8日
    200
  • Node.js Express安装与使用详细介绍

    这次给大家带来Node.js Express安装与使用详细介绍,Node.js Express安装与使用的注意事项有哪些,下面就是实战案例,一起来看一下。 安装 express 为了重写我们的HelloWorld,我们需要安装Express…

    2025年3月8日 编程技术
    200
  • 如何使用node.js创建http文件服务器

    这次给大家带来如何使用node.js创建http文件服务器,使用node.js创建http文件服务器的注意事项有哪些,下面就是实战案例,一起来看一下。 为了读取文件,我们会用到File System模块(名字是”fs”),Stream,我们…

    编程技术 2025年3月8日
    200
  • Node.js使用Angular实战解析

    这次给大家带来Node.js使用Angular实战解析,Node.js使用Angular的注意事项有哪些,下面就是实战案例,一起来看一下。 在“使用AngularJS”中,我们提到了如何在Node.js项目中引入AngularJS,这次提供…

    2025年3月8日
    200
  • 怎样使用JS让数组合并和对象合并

    这次给大家带来怎样使用JS让数组合并和对象合并,使用JS让数组合并和对象合并的注意事项有哪些,下面就是实战案例,一起来看一下。 1 数组合并 1.1 concat 方法 var a=[1,2,3],b=[4,5,6];var c=a.con…

    编程技术 2025年3月8日
    200
  • 怎样操作Node.js使用对话框ngDialog

    这次给大家带来怎样操作Node.js使用对话框ngDialog,操作Node.js使用对话框ngDialog的注意事项有哪些,下面就是实战案例,一起来看一下。 做网站经常会遇到弹出对话框获取用户输入或弹出对话框让用户确认某个操作之类的情景,…

    编程技术 2025年3月8日
    200
  • 怎样使用Node.js操作cookie保持登录

    这次给大家带来怎样使用Node.js操作cookie保持登录,使用Node.js操作cookie保持登录的注意事项有哪些,下面就是实战案例,一起来看一下。 这次来做一个网站登录的小例子,后面会用到。这个示例会用到Cookie、HTML表单、…

    2025年3月8日
    200
  • 使用Vue.js下载方式案例详解

    这次给大家带来使用Vue.js下载方式案例详解,使用Vue.js下载方式的注意事项有哪些,下面就是实战案例,一起来看一下。 vue.js是什么? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。 说明及…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论