我正在尝试在 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/