在 GraphQL 服务器中实现访问控制的好模式是啥?
Posted
技术标签:
【中文标题】在 GraphQL 服务器中实现访问控制的好模式是啥?【英文标题】:What is a good pattern for implementing access control in a GraphQL server?在 GraphQL 服务器中实现访问控制的好模式是什么? 【发布时间】:2016-04-21 14:40:16 【问题描述】:背景:
我有一组模型,包括用户和各种其他模型,其中一些包含对用户的引用。我通过Graffiti 生成的GraphQL API 公开这些模型以进行查询,该API 由使用graffiti-mongoose 适配器的Mongo 数据库提供支持。我当前的 REST API(我正在迁移到 GraphQL)使用 JSON Web Tokens 来验证用户,并在服务器端有一些自定义权限逻辑来处理访问控制。
问题:
我想根据当前登录用户限制对 GraphQL 中对象的访问。某些模型应该可以通过未经身份验证的调用进行读取。大多数其他模型应该只能由创建它们的用户访问。通过 Graffiti 生成的 API 管理对象访问控制的最佳方式是什么?
一般来说,GraphQL 有没有好的访问控制模式?特别是,有没有什么好的例子或库可以用 Graffiti 来做这件事?
注意事项:
我了解 pre- 和 post- 钩子有 been implemented 用于 graffiti-mongoose,并且它们 can be used 用于进行基本的二进制检查以进行身份验证。我想看看如何在 GraphQL API 中使用更详细的访问控制逻辑。将来,我们将希望支持管理员之类的东西,这些管理员有权访问由特定用户组(例如,其隶属关系包括管理员的用户)创建的模型实例。
【问题讨论】:
您应该研究 XACML 和 ABAC,它们是基于细粒度属性的访问控制模型,可用于保护 GraphQL 和其他应用程序的安全 【参考方案1】:通常 GraphQL 不直接处理访问控制,而是将该责任委托给它与之交互的任何数据系统。在你的情况下,这听起来像猫鼬。
由于访问控制逻辑通常是任意逻辑(例如,该用户是否已被禁止访问某些内容?该内容的发布者是否使用自定义隐私设置对其进行了限制?等等),在您的情况下,这听起来像是访问控制逻辑实际上是自定义的,它应该存在于为 GraphQL 字段生成值的“resolve”函数中。
例如:
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.org/learn/authorization【参考方案2】:我创建了一个用于 GraphQL 的规则库访问控制。
https://github.com/joonhocho/graphql-rule
它可以与或不与 GraphQL 一起使用,这很简单。
您可以将它与普通的 javascript 对象一起使用。
希望对 GraphQLers 有所帮助!
【讨论】:
你可能想看看How to offer personal open-source libraries? 谢谢。甚至不知道有这样的规则。以上是关于在 GraphQL 服务器中实现访问控制的好模式是啥?的主要内容,如果未能解决你的问题,请参考以下文章