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

背景:

我有一套模型,其中包括用户和其他各种模型,其中一些包含对用户的引用。 我通过Graffiti生成的GraphQL API公开了这些模型,Mongo数据库使用graffiti-mongoose适配器作为后台。 我当前的REST API(我正在迁移到GraphQL)使用JSON Web令牌来validation用户,并在服务器端有一些自定义权限逻辑来处理访问控制。

问题:

我想根据当前login的用户限制对GraphQL中的对象的访问。 有些模型应该可以通过未经authentication的调用进行读取。 大多数其他模型只能由创build它们的用户访问。 通过Graffiti生成的APIpipe理对象访问控制的最佳方式是什么?

一般来说,GraphQL的访问控制是否有良好的模式? 特别是,有没有什么好的例子或图书馆与涂鸦做呢?

笔记:

据我所知, 已经实施了涂鸦 – mongoose的前后钩子,并且可以用它们进行基本的二进制validation。 我想看看更详细的访问控制逻辑如何在GraphQL API中使用。 将来,我们需要支持像pipe理员那样可以访问由特定用户组创build的模型实例的东西(例如,其用户的机构包括pipe理员)。

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

由于访问控制逻辑通常是任意逻辑的(例如,该用户是否被禁止使用某些内容?该内容的发布者是否通过自定义隐私设置来限制该内容?等等),听起来就像在你的情况下,这个访问控制逻辑是实际上是自定义的,它应该存在于为“GraphQL”字段生成值的“parsing”函数中。

例如:

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; } } } } }); 

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

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

它可以使用或不使用GraphQL。

你可以用一个普通的javascript对象来使用它。

希望它有助于GraphQLers!