我正在尝试在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完全集成在一起。