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

时间:2016-01-15 22:02:59

标签: node.js authentication access-control graphql

背景

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

问题:

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

一般来说,GraphQL的访问控制模式是否良好?特别是,有没有很好的例子或库可以用Graffiti做到这一点?

备注:

据我所知,挂钩之前和之后对于涂鸦猫鼬有been implemented,并且他们can be used要进行基本的二进制检查以进行身份​​验证。我想看看如何在GraphQL API中使用更详细的访问控制逻辑。将来,我们希望支持管理员等可以访问由特定用户组创建的模型实例的内容(例如,其附属关系包含管理员用户的用户)。

2 个答案:

答案 0 :(得分:9)

通常,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;
        }
      }
    }
  }
});

答案 1 :(得分:2)

我创建了一个与GraphQL一起使用的规则库访问控制。

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

它可以与GraphQL一起使用,也可以在没有GraphQL的情况下使用。

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

希望它有助于GraphQLers!

相关问题