GraphQL 中如何处理无权限请求?

AI 编程助手,豆包旗下的编程助手,提供智能补全、智能预测、智能问答等能力,节省开发时间,释放脑海中的创造力,支持 VSCode,点击体验 AI

在 GraphQL 应用程序开发过程中,我们经常会遇到需要对请求进行权限控制的情况。比如,某些查询或者修改操作需要特定的用户权限才能进行,而其他用户则不能执行。在这些场景下,我们需要能够识别用户的身份,并在必要时阻止他们发起无权限请求。本文将介绍在 GraphQL 中如何识别用户身份、控制权限,以及如何处理无权限请求。

识别用户身份

在 GraphQL 应用程序中,我们可以通过某些方式来识别用户身份,例如:

  • 通过 HTTP 请求头中的认证令牌(例如 Authorization 头)来进行认证。
  • 在每个 GraphQL 查询的参数中加入用户 ID(例如 userID 参数)。

这里以 HTTP 请求头方式来说明。当客户端发送 GraphQL 请求时,我们需要从请求头中获取认证令牌,并将其加入到 GraphQL 上下文中,以便后续的解析器和查询处理器能够使用它。示例代码如下所示:

----- - ------------ - - -------------------------
----- - --------------- - - ------------------------------
----- - --------- - - -------------------

----- -------- - -
  ---- ----- -
    ----- ----
  -

  ---- ---- -
    --- ---
    ------ -------
  -
--

----- --------- - -
  ------ -
    ----- -------- ----- -------- -- -
      ----- ------ - ---------------
      -- ---- -- ------------
    --
  --
--

----- ------ - --- --------------
  ---------
  ----------
  -------- -- --- -- -- --
    ------- ---------------
  ---
---

----------------------- --- -- -- -
  ------------------- ----- -- ---------
---

在示例代码中,getUserId 函数可以根据请求头中的认证令牌获取用户 ID。如果无法识别用户身份,则认为没有权限请求。

控制权限

在识别了用户身份之后,我们需要对用户请求的操作进行权限控制。在 GraphQL 中,我们可以定义字段级别或者类型级别的权限控制。在这里,我们以字段级别的权限控制为例。

假设我们只有管理员才能够查询用户的具体信息(例如电子邮件地址)。我们可以在查询的类型定义中将 email 字段定义为只有管理员可以访问:

----- - ------------- --- - - -------------------------
----- - --------------- - - ------------------------------
----- - --------- - - -------------------

----- -------- - ----
  ---- ----- -
    ----- ----
  -

  ---- ---- -
    --- ---
    ------ ------- ------------ --------
  -
--

----- --------- - -
  ------ -
    ----- -------- ----- -------- -- -
      ----- ------ - ---------------
      -- ---- -- ------------
    --
  --
  ----- -
    ------ -------- ----- -------- -- -
      ----- ----- - --------------
      -- -------------------------- -
        ----- --- ---------- -------------
      -
      ------ -------------
    --
  --
--

----- ----------- - -
  ----- -
    ------ -- ----- ------- -- -- -
      ----- ----- - --------------
      -- -------------------------- -
        ----- --- ---------- -------------
      -
    --
  --
--

----- ------ - --- --------------
  ---------
  ----------
  -------- -- --- -- -- -
    ----- ------ - ---------------
    ----- ---- - --------------------
    ------ -
      ------- --------
      ------ -----------
    --
  --
---

----------------------- --- -- -- -
  ------------------- ----- -- ---------
---

在示例代码中,我们定义了一个 @auth 指令,只有指定的角色才能访问该字段。在每个查询解析器中,我们根据用户的角色信息进行访问控制,如果用户没有相应的角色,则抛出错误,拒绝请求。

同时,我们还可以定义类型级别的权限控制,以对某个类型下的所有字段进行统一限制。这里不再赘述,有兴趣的读者可以参考 GraphQL 官方文档。

处理无权限请求

当用户发起无权限请求时,我们需要对这些请求进行合适的处理。常见的处理方式包括:

  • 抛出错误:在每个解析器中抛出错误,返回错误信息给客户端。
  • 隐藏字段:在查询结果中屏蔽掉无权限访问的字段,只返回有权访问的字段。
  • 改变响应:例如在查询结果中做一些替换或者空值处理。

其中,抛出错误是最常见的处理方式,也是最保险的方式。我们可以在每个解析器中进行验证,抛出相应的错误信息给客户端。示例代码如下所示:

----- --------- - -
  ------ -
    ----- -------- ----- -------- -- -
      ----- ------ - ---------------
      ----- ----- - --------------
      ----- ---- - ---------------------
      -- -------- --- ------ -- ------------------------- -
        ----- --- ---------- -------------
      -
      ------ -----
    --
  --
--

在示例代码中,如果查询的用户 ID 不是当前用户 ID,并且当前用户也不是管理员,则抛出 Not authorized 错误,拒绝请求。客户端可以根据错误信息做相应的处理,例如提示用户重新登录,或者提醒用户其没有相应的权限。

结论

在 GraphQL 应用程序中,我们需要对用户身份进行验证,并进行权限控制。通过字段级别或者类型级别的授权定义,我们可以限制用户访问某些特定字段或者类型。当用户发起无权限请求时,我们可以选择抛出错误、隐藏字段或者改变响应等合适的处理方式。控制好用户访问权限,可以保证应用程序的安全性和稳定性。

参考

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/67213b922e7021665e06c534


猜你喜欢

  • Express.js 防止 XSS 攻击的方法

    XSS(Cross-site scripting)是一种常见的 Web 攻击方式,其攻击方式为将恶意脚本(通常是 JavaScript)注入到 Web 页面中,当用户访问该页面时,恶意代码将在用户浏览...

    12 天前
  • 如何在响应式设计中使用 Canvas?

    在现代Web中,响应式设计已经成为一种标准。使用响应式设计让您的网站看起来伟大,不论您的用户使用哪种设备。在许多情况下,您可能需要在响应式设计中使用Canvas来提供复杂的交互和可视化效果。

    12 天前
  • 教你如何安全的使用 ECMAScript 2019

    ECMAScript 2019,也称为 ECMAScript 10,是 JavaScript 的最新版本。发布于2019年,它包含了一些重要的新特性和功能,例如 Array flat 和 flatMa...

    12 天前
  • 使用 GraphQL 和 Apollo 简化应用的数据请求

    GraphQL 是一种新兴的数据查询语言,它提出了一个前所未有的数据查询方式,可以减少网络传输时间、提高数据请求的效率。同时,与前端框架集成时也提供更好的代码模块化、类型检查和文档化的能力。

    12 天前
  • 如何在 Webpack 打包后使用 Promise

    Webpack 是一款非常出色的前端构建工具,目前已成为前端开发过程中不可或缺的一部分。Webpack 通过模块管理和编译构建,帮助我们在前端开发中自动化完成许多常见的任务,使代码的编写更加高效、简单...

    12 天前
  • 如何使用 Node.js 和 Express 实现文件下载的功能?

    作为现代网站开发的一部分,文件下载功能是不可避免的,也是必不可少的。无论是通过导航条下载,还是通过特定页面链接下载文件,文件下载功能都是必不可少的。本文指导您如何使用 Node.js 和 Expres...

    12 天前
  • 如何选择 Serverless 的日志方案

    随着云计算的发展,越来越多的开发者选择使用 Serverless 架构来构建他们的应用程序。Serverless 架构的一个明显的优势是它能够提供更高的灵活性和可扩展性,但是在处理日志时,Server...

    12 天前
  • 如何在大规模数据处理应用中使用 Spark 进行性能优化

    如何在大规模数据处理应用中使用 Spark 进行性能优化 随着大数据时代的到来,对于数据的处理需求也越来越大,而 Spark 作为一个流行的分布式计算框架,可以快速处理海量数据。

    12 天前
  • Kubernetes 中的资源配额和限制:如何限制 Pod 使用的资源

    随着 Kubernetes 的日益普及,资源管理成为了越来越重要的问题。在 Kubernetes 中,可以通过资源配额和限制来限制 Pod 使用的资源。在本文中,我们将深入探讨 Kubernetes ...

    12 天前
  • Material Design 中 CardView 的使用技巧

    什么是 CardView? CardView 是 Material Design 中的一个组件,它可以在 Web 界面中创建类似于卡片的设计元素。通过使用 CardView,Web 开发人员可以轻松地...

    12 天前
  • Redux 中如何处理分页数据的操作

    Redux 中如何处理分页数据的操作 在前端开发中,分页功能是一个比较常见的需求,我们需要在前端对数据进行切分,渲染出分页 UI,并且支持用户点击不同页面进行数据查询。

    12 天前
  • MongoDB 中如何进行数据集合复制

    MongoDB 是一种 NoSQL 数据库,它提供了数据集合复制机制来保证数据的可靠性和高可用性。数据复制可以在单个 MongoDB 实例上工作,也可以在多个实例之间工作。

    12 天前
  • Fastify 应用中如何使用日志记录

    随着前端技术发展,越来越多的应用开始使用 Fastify 进行开发。在应用开发过程中,日志记录是一项重要的任务。日志记录有助于开发人员追踪应用程序的行为,并快速解决问题。

    12 天前
  • 可靠的异步编程解决方案:Promise 的逐步实现

    随着前端应用的不断发展,现代开发方式越来越倾向于异步编程。在 JavaScript 中,由于其单线程的特性,当遇到长时间阻塞的 I/O 操作(例如网络请求)时,整个应用就会变得非常缓慢。

    12 天前
  • PM2 如何保证应用的 100% 可靠性

    前言 在现代互联网时代,高可用性的应用非常重要。由于前后端分离的趋势越来越明显,前端应用的可靠性也变得越来越重要。在 Node.js 世界中,PM2 是一个非常重要的工具,可以帮助前端开发者保证应用的...

    12 天前
  • 如何使用 CSS Grid 实现响应式的输入框布局

    随着更多的人通过移动设备使用互联网,响应式设计技术变得越来越重要。现在,我们可以使用 CSS Grid 来轻松地构建响应式布局。在本文中,我们将学习如何使用 CSS Grid 实现一个响应式的输入框布...

    12 天前
  • 如何使用 CSS Reset 去除默认样式对 SEO 的影响

    在前端开发中,我们经常会使用默认样式作为基础,但是默认样式会带来一定的 SEO 影响,因为搜索引擎更倾向于使用无样式的 HTML。这时我们可以使用 CSS Reset 来消除默认样式。

    12 天前
  • ECMAScript 2020 中的新对象 methods,让 JavaScript 更易上手

    JavaScript 作为现在最流行的语言之一,其不断发展的生态系统中也时常出现新的功能和特性,ECMAScript 2020 (ES2020) 中引入的新对象 methods 是其中之一。

    12 天前
  • 使用 Babel 编译 ES6 代码时出现的 “Illegal constructor” 报错原因分析

    背景 ES6(ECMAScript 2015)是 JavaScript 的一个新版本,它引入了很多新的语法和特性,例如箭头函数、模块化和类等。尽管它已经发布多年,但很多浏览器和 Node.js 环境仍...

    12 天前
  • Redis 集群故障排查及解决方案

    前言 Redis 是一个广泛使用的开源键值存储数据库,被广泛应用于 web 开发,数据缓存以及消息队列等领域。Redis 的高可用性是其得到广泛推广的主要原因之一。

    12 天前

相关推荐

    暂无文章