Nodejs 应用如何配合 keystone 实现 RBAC 功能

发布于 1周前 作者 caililin 来自 nodejs/Nestjs

Nodejs 应用如何配合 keystone 实现 RBAC 功能

准备开发 Nodejs 下的企业内应用并实现 RBAC,大致了解了下实现方式,按我的理解是这样的:

  1. Openstack 的 keystone 可以配合 LDAP 实现用户的认证及权限配置
  2. 在 keystone 中针对应用配置不同项目的用户角色所具有目标资源的权限
  3. Nodejs 应用调用 keystone API,传入角色,目标资源等参数后返回是否具有权限后应用自行控制

或者各位大神有很好的用 Keystone 实现 RBAC 实例可否分享


6 回复

OpenStack 里的其他服务都是通过一个 middleware 来实现 keystone 的认证的,你可以照着它实现一遍。https://github.com/openstack/keystonemiddleware/blob/master/keystonemiddleware/auth_token/init.py


记得几年前 LDAP 的实现基本是废的,现在不知道怎么样。


关注下,楼主找到好的方案后麻烦 @下我


两位大神能不能看看

没有现成的,另外你问得也太宽泛,用途是自己 Intranet 用用,还是放到产品里面?准备投入多少开发人力?

如果只是自己 Intranet 里面用,我对 Nodejs 一窍不通,仅以 Django 为例,说下可能的思路:

User/Group ID & Auth 由 LDAP 作 Provider,用 https://pypi.python.org/pypi/django-auth-ldap 连接

RBAC Roles/Assignments/Resources/Tokens 用 SQL DB 存储,参考 https://github.com/ging/fiware-idm (参考其 API 设计,不推荐其 Fork keystone 直接改的方式)

Authorization Policies 管理,用 Openstack 自己的 https://github.com/openstack/oslo.policy

Keystone 处于中间连接位置,相当于 MVC 里的 Controller,剩下 View 的部分不用多讲

如果是放到规模化产品里面,人力又不特别充裕,建议不要自己折腾,老老实实买商业方案集成进去,因为要把 IAM 功能和安全都搞到位,很不容易,特别是安全方面需要专家。

非常感谢,已经提供了思路
目前只是内部管理系统实现,将来可能会根据情况作为产品实现,所以现在还可以折腾一下,将来不行了再考虑买个成熟方案吧

在 Node.js 应用中配合 Keystone 实现基于角色的访问控制(RBAC)功能,你可以通过以下步骤来实现。Keystone 是一个开源的 Node.js 和 GraphQL 框架,它允许你快速构建数据库驱动的 API。

  1. 安装 Keystone 和相关依赖

    npm install [@keystonejs](/user/keystonejs)/keystone [@keystonejs](/user/keystonejs)/adapter-mongoose [@keystonejs](/user/keystonejs)/fields
    npm install [@keystonejs](/user/keystonejs)/auth-password [@keystonejs](/user/keystonejs)/list-plugins
    
  2. 定义用户、角色和权限模型

    const { Keystone, List, Text, Password, Checkbox, Relationship } = require('[@keystonejs](/user/keystonejs)/keystone');
    
    const keystone = new Keystone({
      name: 'MyApp',
      adapter: new AdapterMongoose({}),
    });
    
    keystone.createList('User', {
      fields: {
        name: { type: Text },
        email: { type: Text, isUnique: true },
        password: { type: Password },
        roles: { type: Relationship, ref: 'Role.users' },
      },
    });
    
    keystone.createList('Role', {
      fields: {
        name: { type: Text, isUnique: true },
        permissions: { type: Checkbox, options: ['read', 'write', 'delete'] },
      },
    });
    
    module.exports = keystone;
    
  3. 实现访问控制逻辑: 在查询或变更数据时,根据用户的角色和权限进行验证。这可以通过在 Keystone 的 hooks 或中间件中实现。

  4. 启动 Keystone 应用

    const { createServer } = require('[@keystonejs](/user/keystonejs)/server-express');
    const expressApp = express();
    const server = createServer({
      keystone,
      app: expressApp,
    });
    
    server.start();
    

通过上述步骤,你可以在 Node.js 应用中利用 Keystone 实现 RBAC 功能。根据具体需求,你可以进一步扩展和优化这些代码。

回到顶部