节点js中的ACL基于关系

问题描述 投票:4回答:1

我正在尝试在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级别的这种行为?

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

node.js permissions npm sequelize.js acl
1个回答
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完全集成在一起。

© www.soinside.com 2019 - 2024. All rights reserved.