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

2024-06-19

背景:

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

Problem:

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

一般来说,GraphQL 是否有良好的访问控制模式?特别是,是否有任何好的例子或库可以用 Graffiti 来实现这一点?

Notes:

我知道前钩和后钩有已实施 https://github.com/RisingStack/graffiti-mongoose/pull/57对于涂鸦猫鼬来说,他们可以使用 https://github.com/RisingStack/graffiti-mongoose/issues/42进行基本的二进制检查以进行身份​​验证。我想了解如何将更详细的访问控制逻辑应用到 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;
        }
      }
    }
  }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 GraphQL 服务器中实现访问控制的好模式是什么? 的相关文章

随机推荐