节点js中的ACL基于关系

时间:2016-07-24 20:59:36

标签: 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级别支持此类行为的任何其他模块?

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

1 个答案:

答案 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完全集成用于您的用例。