我试图在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级别支持此类行为的任何其他模块?
如果没有,我必须实现一个自定义的,那么创建这样的东西的最佳方法是什么。
答案 0 :(得分:3)
有一个相对较新的库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完全集成用于您的用例。