node.js - Node js中基于关系的ACL

标签 node.js permissions npm sequelize.js acl

我正在尝试在 Node js 中实现某种权限框架,使用 sequelize 作为 ORM(使用 Postgres)。经过几个小时的研究,我能找到的最接近现有 npm 模块的方法是使用 acl。使用 acl sequelize 来支持我的堆栈。

问题是 acl 模块似乎分配了一个角色,该角色将获得一组对特定资源的所有实例 的权限。但是,我需要根据该用户的现有关系对实例进行许可。

例如,考虑一个简单论坛的许可系统。它为每个角色提供以下权限:

    // allow guests to view posts
    acl.allow("guest", "post", "view");

    // allow registered users to view and create posts
    acl.allow("registered users", "post", ["view", "create"]);

    // allow administrators to perform any action on posts
    acl.allow("administrator", "post", "*");

假设我还想为注册用户添加编辑自己帖子的功能,并且用户与他们创建的所有帖子都有关系。

这个模块有没有办法做到这一点,或者任何其他模块可以在数据库/ORM 级别支持这种行为?

如果没有,我必须实现一个自定义的,那么创建这样的东西的最佳方法是什么。

最佳答案

有比较新的库CASL .我是这个图书馆的作者。并且可以很容易地实现您的用例:

const { AbilityBuilder } = require('casl')

const ability = AbilityBuilder.define((can, cannot) => {
  can('read', 'all')
  can(['update', 'delete'], 'Article', { author_id: loggedInUser.id })
})

上面的代码基本上说: - 任何人都可以阅读一切 - 任何人都可以更新和删除 author_id 等于登录用户 id 的文章

稍后你可以做:

ability.can('delete', 'Post') 
//or
ability.can('update', post)
// where post variable is an instance of your Post model

还有一篇文章针对您的用例解释了如何将 CASL 与 MongoDB 和 Express 集成。

关于node.js - Node js中基于关系的ACL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38556732/

相关文章:

node.js - 请求 https ://registry. npmjs.org/co 失败

node.js - Node.js 服务的打包 - 类似 .war

javascript - 使用nodejs和jade的Angular文件夹结构

javascript - 无法运行监听 443 的 Node js 应用程序

ios - 适用于 iOS 的 Facebook 登录 - 只有管理员可以登录,其他用户不能

firebase - 无法从系统升级或删除 Firebase

javascript - 哪个 Javascript 函数库 : Underscore or wu. js 或 Functional 或...?

android - 如何在运行时检查 android 安全权限?

C++/Linux 如何获取其他用户的读取权限统计信息?

node.js - 如何在 Typescript 项目中使用来自 Node 16 的计时器/ promise ?