如何处理GraphQL服务器中的授权?

我应该在每个请求的Authentication头中传递JWT令牌,并在resolve()之后检查授权用户,并检查用户对每个查询和突变的角色

解决方法

介绍

首先,一种常见的身份验证方法是使用签名的JWT,其中包含发出请求的用户的id.

现在让我们看看在考虑给定请求的授权时我们可以使用的不同参数.

>谁在提出要求?

由上面提到的用户ID确定.可以在数据库中查找有关请求者的更多信息,例如关联的用户角色.这意味着如果我们使用sql,我们需要维护一个User表,并在注册时向该表添加新用户.
>应该执行哪个操作?

用户可能被授予只读访问权限.某些突变或查询仅允许某些用户使用.
>哪些字段包含在查询/突变响应中?

某些字段只能由某些用户访问.

权限

记住这些信息,我们可以提出不同的许可系统.最常见的是,在这样的系统中,默认情况下不允许任何操作.当请求进入时,上述参数可以与现有权限匹配,如果找到匹配权限,则授予请求.

基于角色的权限

在某些应用程序中,基于角色的方法非常有效.
例如,对于更简单的Stack Overflow版本,我们可以拥有角色EVERYONE,AUTHENTICATED和MODERATOR.明智的许可规则可能是这样的:

>每个人都可以阅读问题/答案

>请求者:无关紧要(每个人)
>操作:allQuestions,allAnswers查询
>字段:文本

其他规则(保留参数):
* AUTHENTICATED用户可以创建新的问题/答案
* MODERATOR用户可以创建新的问题/答案
* MODERATOR用户可以删除问题/答案.

现在,例如,如果有一个未经过身份验证的请求进入请求allQuestions查询,那就没问题,因为我们找到允许它的权限(第一个).

另一方面,如果对没有MODERATOR角色且包含deleteQuestion变异的用户进行了经过身份验证的请求,则无法找到这些参数的权限.所以请求被拒绝了.

图表权限

虽然基于角色的权限已经代表了一个可靠的权限系统,但如果我们想要根据请求者和请求的节点之间的关系等方式授予权限,则它们根本不适合.在我们的示例中,添加简单规则是非常重要的,即允许任何用户删除自己的问题/答案.

在Graphcool,我们提出了一种强大但相当简单的方法,我们称之为图形权限来解决这个问题.在检查权限时,我们可以使用以下附加参数:

>即将访问或修改哪个节点?

由节点id确定

然后,我们可以使用针对特殊权限模式的GraphQL查询来表达权限,以授予或拒绝节点级别的权限.仅当权限查询包含至少一个非空的叶节点时,才会访问给定节点.

在我们的例子中,我们可以指定此权限查询:

query {
  allAnswers(filter:{
      authorId: $userId,id: $nodeId
  }) {
    id
  }
}

对于由GraphQL变量$userId和$nodeId指定的给定节点和用户,如果节点不是由当前用户创建,则使用查询参数过滤器返回空列表,否则返回非空值.

GraphQL服务器中的授权的更多相关文章

  1. GraphQL在react中的应用示例详解

    这篇文章主要为大家介绍了GraphQL在react中的应用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  2. GraphQL入门总体创建教程

    这篇文章主要为大家介绍了GraphQL入门总体创建教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  3. SpringBoot集成Graphql Query实战示例

    这篇文章主要为大家介绍了SpringBoot集成Graphql Query实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. Laravel中GraphQL接口请求频率实战记录

    这篇文章主要给大家介绍了关于Laravel中GraphQL接口请求频率的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  5. 从Hello World开始理解GraphQL背后处理及执行过程

    这篇文章主要为大家介绍了从Hello World开始理解GraphQL背后处理过程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  6. 使用与输入和输出类型相同的类的NestJS GraphQL

    看完这篇文章后,我想知道假设“代码优先”范式的正确方法是什么。下面的方法似乎有效——使用Location作为输入和输出。我知道对于共享代码的输入和输出类型有很多不好的地方——输入有各种验证,而输出没有,等等。但我认为Location是一个很好的例外,因为从大的角度来看,让我们假设Location像String或Int——在整个模式中被视为一个原语:然后我不明白为什么我不应该重复使用像Location这样简单的东西。其他人对此有看法吗?

  7. React内存使用情况部署到Heroku

    我最近完成了一个MERN堆栈web应用程序,并试图将其部署到Heroku上。它看起来像是已部署的,但当我尝试登录或创建用户时,它显示404未找到/grapql。当运行heroku日志-tails时,它在发布后表示,应用程序由于内存使用超过配额而崩溃。所以我在本地运行它,并使用DevTools查看内存使用情况。我目前正在尝试重构搜索到的内容,并使用react.llazy只显示用户的观点。

  8. 实现GraphQL Go解析器时的奇怪错误

    请帮帮我,我迷路了。

  9. 就数据库查询而言,GraphQL如何将分页应用于嵌套连接?

    我第一次尝试GraphQL、分页和Rails中的批加载。问题是,当我像下面这样运行查询时:我看到生成了以下SQL语句:所以,我的困惑是这里LIMIT的用法。Goal上的第一个查询是根据请求的页面添加LIMIT和OFFSET。但是,嵌套连接正在设置一个LIMIT=100,这与我的页面请求没有任何关系,而且我没有在任何地方设置值100。那么,为什么限制为100,以及如何应用页面大小?所以,也许预加载是正确的方式,除了可能我一开始没有正确实现分页?

  10. 更改对graphQL查询的响应

    我有一个返回如下对象的查询:其中一些字段将包含非字母数字字符,我希望从响应中去掉这些字符但这行不通。如何在使用数据之前修复数据?我不控制后端,也不控制数据如何进入后端。

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部