首页 > 语言 > 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();    };  }            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选