Node.js 在GraphQL服务器中实现访问控制的好模式是什么?

Node.js 在GraphQL服务器中实现访问控制的好模式是什么?,node.js,authentication,access-control,graphql,Node.js,Authentication,Access Control,Graphql,背景: 我有一组模型,包括一个用户和各种其他模型,其中一些模型包含对用户的引用。我通过使用适配器的Mongo数据库支持的GraphQLAPI生成这些模型,以供查询。我当前的RESTAPI(我正在迁移到GraphQL)使用JSON Web令牌对用户进行身份验证,并且在服务器端有一些自定义权限逻辑来处理访问控制 问题: 我想根据当前登录的用户限制对GraphQL中对象的访问。一些模型应该可以通过未经验证的调用进行读取。大多数其他模型应该只能由创建它们的用户访问。通过涂鸦生成的API管理对象访问控制的

背景:

我有一组模型,包括一个用户和各种其他模型,其中一些模型包含对用户的引用。我通过使用适配器的Mongo数据库支持的GraphQLAPI生成这些模型,以供查询。我当前的RESTAPI(我正在迁移到GraphQL)使用JSON Web令牌对用户进行身份验证,并且在服务器端有一些自定义权限逻辑来处理访问控制

问题:

我想根据当前登录的用户限制对GraphQL中对象的访问。一些模型应该可以通过未经验证的调用进行读取。大多数其他模型应该只能由创建它们的用户访问。通过涂鸦生成的API管理对象访问控制的最佳方法是什么

一般来说,GraphQL是否有良好的访问控制模式?特别是,有没有好的例子或图书馆可以用来涂鸦?

注意事项:


我知道前钩子和后钩子对于涂鸦猫鼬是有用的,它们需要对身份验证进行基本的二进制检查。我想看看如何在GraphQLAPI中使用更详细的访问控制逻辑。将来,我们希望支持管理员这样的功能,他们可以访问由特定用户组创建的模型实例(例如,其附属关系包括管理员的附属关系的用户)。

通常GraphQL不直接处理访问控制,相反,将该责任委托给它与之接口的任何数据系统。对你来说,这听起来像猫鼬

由于访问控制逻辑通常是任意逻辑(例如,该用户是否被禁止访问某些内容?该内容的发布者是否使用自定义隐私设置对其进行了限制?等等),而且在您的案例中,该访问控制逻辑实际上是自定义的,因此它应该存在于“解析”中函数,该函数为GraphQL字段生成值

例如:

var UserType = new GraphQLObjectType({
  name: 'User',
  fields: {
    name: { type: GraphQLString },
    birthday: {
      type: GraphQLString,
      resolve(user, context) {
        var auth = context.myLoggedInAuth;
        if (myCanAuthSeeBirthday(auth, user)) {
          return user.birthday;
        }
      }
    }
  }
});

我创建了一个用于GraphQL的基于规则的访问控制

它可以与GraphQL一起使用,也可以不与GraphQL一起使用,这一点非常简单

您可以将它与普通javascript对象一起使用


希望它能帮助GraphQLers

您应该研究XACML和ABAC,它们是细粒度的基于属性的访问控制模型,您可以使用它们来保护GraphQL和其他应用程序。谢谢。我甚至不知道这样的规则存在。这可能会导致代码变得笨拙,具体取决于项目的范围。这是解析程序本身对解耦合授权的官方立场