Nodejs有什么好的权限管理模块,rbac或者acl之类的实现

Nodejs有什么好的权限管理模块,rbac或者acl之类的实现

有access control的开源项目么,我最近找了好几个, http://stackoverflow.com/questions/9392978/group-rule-based-authorization-approach-in-node-js-and-express-js 但是都太过于简单了

##有什么比较完整的Demo,连同数据库(mongo,redis等)一起实现的rbac项目可以学习参考的,谢谢


16 回复

感觉得结合操作系统的API. node原生不带这个的.


当然可以!以下是一个关于Node.js权限管理模块的详细解答,包括RBAC(基于角色的访问控制)或ACL(访问控制列表)的实现。

Node.js 权限管理模块

在Node.js中,有许多成熟的权限管理库可以帮助你实现RBAC或ACL。其中一些流行的库包括:

  1. Casl - 一个强大的权限管理系统,支持RBAC。
  2. Acl - 一个简单的ACL库。
  3. Passport - 虽然主要用于身份验证,但也可以与授权系统结合使用。

示例代码

这里我们以Casl为例来展示如何实现一个基本的RBAC系统。

安装 Casl

首先,你需要安装@casl/ability@casl/react(如果需要React集成):

npm install @casl/ability

创建模型和角色

假设我们有一个用户模型和一些资源(例如文章):

const { AbilityBuilder } = require('@casl/ability');

function defineAbilitiesFor(user) {
  const { can, cannot, build } = new AbilityBuilder(Ability);
  
  if (user.isAdmin) {
    can('manage', 'all');
  } else {
    can('read', 'Article');
    if (user.isAuthor) {
      can('create', 'Article');
      can('update', 'Article', { authorId: user.id });
      can('delete', 'Article', { authorId: user.id });
    }
  }

  return build();
}

使用权限检查

你可以根据用户的权限来决定是否允许执行某些操作:

const ability = defineAbilitiesFor({ isAdmin: false, isAuthor: true });

if (ability.can('update', 'Article')) {
  console.log('User can update articles.');
} else {
  console.log('User cannot update articles.');
}

集成到Express应用

将权限检查集成到你的Express应用中:

const express = require('express');
const app = express();

app.use(express.json());

app.post('/articles/:id', (req, res) => {
  const ability = defineAbilitiesFor(req.user);

  if (ability.can('create', 'Article')) {
    // 处理创建文章逻辑
    res.status(200).send('Article created successfully.');
  } else {
    res.status(403).send('Forbidden');
  }
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

数据库集成

为了存储用户、角色和权限,你可以选择MongoDB或Redis等数据库。这里以MongoDB为例:

定义用户和角色模型

const mongoose = require('mongoose');

const roleSchema = new mongoose.Schema({
  name: String,
  permissions: [String]
});

const userSchema = new mongoose.Schema({
  username: String,
  roles: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Role' }]
});

const Role = mongoose.model('Role', roleSchema);
const User = mongoose.model('User', userSchema);

设置用户角色

async function setup() {
  const adminRole = await Role.findOne({ name: 'admin' });
  const newUser = new User({
    username: 'testuser',
    roles: [adminRole._id]
  });

  await newUser.save();
}

setup();

通过这种方式,你可以构建一个功能齐全的RBAC系统,并将其集成到你的Node.js应用中。希望这对你有所帮助!

看来只有自己写了

node_acl是不是满足你的需求?

node_acl中規中矩的教科書似的實現,看看就行,想用起來順手還是自己寫吧

自己寫吧 我也是在網上搜了兩三天沒找到很符合中國特色的 一面看書學習angular一面用MEAN自己寫 其實一兩天就能做好

[@jiangzhuo](/user/jiangzhuo) 这种中规中矩的实现,你在实际使用的过程中,遇到哪些不方便的地方?很想了解一下。

关注

我也是自己写的

https://github.com/skipify/islogin

直接再验证登录的地方做的很简单,里面有个小例子

我把thinkphp的auth类给抄过来了,不过还有一个session登录验证没做,毕竟我只是对着Php抄的。

开源博客系统liblog已经具备权限管理,方便可以自定义,并且开放源码,可以参照他看一下http://livisky.github.io/

顺手的、符合中国特色的、支持MongoDB, Redis等多种数据库的,你需要node-casbin:https://github.com/casbin/node-casbin

关于Node.js中的权限管理模块,特别是RBAC(基于角色的访问控制)或ACL(访问控制列表)的实现,有许多优秀的库可以选择。这里推荐两个广泛使用的库:caslnode_acl

Casl

Casl 是一个非常灵活且功能强大的权限管理库,它允许你根据业务逻辑定义复杂的权限规则。Casl 可以与各种存储后端结合使用,如 MongoDB、PostgreSQL 等。

示例代码:

const { AbilityBuilder } = require('@casl/ability');

function defineAbilitiesFor(user) {
  const { can, cannot, build } = new AbilityBuilder(Ability);

  if (user.role === 'admin') {
    can('manage', 'all');
  } else if (user.role === 'editor') {
    can('update', 'Article');
  }

  return build();
}

// 使用
const user = { role: 'editor' };
const ability = defineAbilitiesFor(user);

if (ability.can('update', 'Article')) {
  console.log('You can update an article.');
} else {
  console.log('Access denied.');
}

Node_acl

Node_acl 是另一个常用的库,提供了简单的API来管理权限。它可以与多种数据库(如 MongoDB 或 Redis)结合使用。

示例代码:

const acl = require('acl');

// 配置数据库连接
const mongoBackend = new acl.mongodbBackend(db, 'acl_');
acl = new acl(mongoBackend);

// 定义权限
acl.addUserRoles('user1', ['role1']);
acl.allow([
  {
    roles: ['role1'],
    allows: [{ resources: 'articles', permissions: 'get' }]
  }
]);

// 检查权限
acl.isAllowed('user1', 'articles', 'get')
  .then(result => {
    if (result) {
      console.log('Access granted.');
    } else {
      console.log('Access denied.');
    }
  });

总结

这两个库都可以实现复杂的权限管理需求,并且支持多种数据库后端。如果你需要更灵活和复杂的权限管理逻辑,casl 是一个很好的选择;如果你只需要简单的权限检查功能,node_acl 会更容易上手。

回到顶部