在 GraphQL 服务器中实现访问控制的良好模式是什么



背景:

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

问题:

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

一般来说,GraphQL 是否有良好的访问控制模式? 特别是,是否有任何使用涂鸦的好示例或库?

笔记:

我知道已经为涂鸦猫鼬实现了前钩和后钩,并且它们可用于对身份验证进行基本的二进制检查。 我想看看如何将更详细的访问控制逻辑工作到 GraphQL API 中。 将来,我们将希望支持诸如有权访问由特定用户组创建的模型实例的管理员(例如,其隶属关系包括管理员的用户)之类的功能。

通常,GraphQL 不直接处理访问控制,而是将该责任委托给与之接口的任何数据系统。在你的情况下,这听起来像猫鼬。

由于访问控制逻辑

通常是任意逻辑(例如,该用户是否被禁止访问某些内容?该内容的发布者是否使用自定义隐私设置对其进行了限制?等等),听起来在您的情况下,此访问控制逻辑实际上是自定义的,它应该存在于"resolve"函数中,该函数为 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 的规则库访问控制。

https://github.com/joonhocho/graphql-rule

它很简单,可以与或不与 GraphQL 一起使用。

您可以将其与普通的javascript对象一起使用。

希望它对 GraphQLers 有所帮助!

最新更新