如何在 GraphQL 中执行自定义授权

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

简介

GraphQL 是一种用于 API 的查询语言,它允许客户端在一个请求中指定需要返回的数据,从而减少了 API 请求的数量。GraphQL 的一个重要特性是可以在查询中定义自定义授权规则,以确保只有授权的用户才能访问特定的数据。

本文将介绍如何在 GraphQL 中执行自定义授权,包括授权规则的定义和如何在 GraphQL 的解析器中实现授权逻辑。我们将使用一个简单的示例来演示如何实现自定义授权。

示例

我们将使用一个简单的博客应用程序作为示例。博客应用程序包含文章、评论和用户三个类型。每个文章和评论都可以被一个或多个用户所拥有。我们的目标是确保只有文章或评论的所有者才能编辑或删除它们。

首先,我们需要定义 GraphQL 模式来表示我们的数据类型。以下是我们的 GraphQL 模式:

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

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

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

我们可以看到,每个文章都有一个作者和一个编辑器列表,每个评论都有一个作者和一个文章。现在我们需要定义授权规则来确保只有文章或评论的所有者才能编辑或删除它们。

定义授权规则

我们将使用 GraphQL 的 directive 来定义授权规则。directive 是一种将元数据附加到 GraphQL 操作的方法。我们将使用 @auth 指令来定义授权规则。

以下是 @auth 指令的定义:

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

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

@auth 指令接受一个 requires 参数,该参数指定了需要的角色。我们定义了两个角色:ADMINUSER。默认情况下,requires 参数设置为 USER,这意味着只有经过身份验证的用户才能访问该字段。如果我们将 requires 参数设置为 ADMIN,则只有管理员才能访问该字段。

现在我们可以将 @auth 指令应用于我们的模式中的字段,以确保只有授权的用户才能访问它们。以下是我们如何在 Article 类型中应用 @auth 指令:

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

我们将 @auth 指令应用于 editors 字段,并将 requires 参数设置为 ADMIN,这意味着只有管理员才能访问该字段。现在我们需要实现授权规则,以确保只有文章或评论的所有者才能编辑或删除它们。

实现授权规则

我们将使用 JavaScript 来实现授权规则。我们将在 GraphQL 的解析器中实现授权逻辑。以下是我们如何实现授权逻辑:

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

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

我们在 ArticleComment 类型的解析器中实现了授权逻辑。对于 Article 类型的 editors 字段,我们检查用户是否具有管理员角色或是否是文章的所有者。对于 Comment 类型的 authorarticle 字段,我们检查用户是否是评论或文章的所有者。

如果用户未经授权访问该字段,我们将抛出一个 AuthenticationError 异常。这将导致 GraphQL 返回一个错误响应,告诉客户端用户未经授权访问该字段。

现在我们已经实现了自定义授权规则,我们可以使用以下查询来测试我们的授权规则:

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

如果我们尝试访问 editors 字段,但是没有管理员角色或不是文章的所有者,GraphQL 将返回一个错误响应。

结论

GraphQL 允许我们定义自定义授权规则,以确保只有授权的用户才能访问特定的数据。我们可以使用 @auth 指令来定义授权规则,并在 GraphQL 的解析器中实现授权逻辑。通过正确实现自定义授权规则,我们可以确保我们的应用程序是安全的,并且只有授权的用户才能访问敏感数据。

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


猜你喜欢

  • ES8 之 try catch 语法进阶

    在前端开发中,错误处理是非常重要的一部分。我们在开发过程中经常使用 try catch 语句来捕获和处理可能出现的错误。ES8 为我们带来了一些新的功能和语法,使我们能够更好地处理异常和错误。

    8 天前
  • ESLint 配置完全攻略,规则细节与实践解析

    作为前端开发人员,我们要写出高质量、可维护且符合规范的代码。而 ESLint 可以帮助我们实现这一目标。本文将为大家解析 ESLint 的规则细节以及实践中的应用,帮助大家配置出最佳的 ESLint。

    8 天前
  • Chai 三种使用方法详解

    前言 Chai 是一个流行的 JavaScript 断言库,用于编写可读性更好的测试代码。它提供了三种不同的风格来表达测试断言的表述。本文将介绍这三种使用方法,并探讨它们的差异和使用场景。

    8 天前
  • 在 Express.js 应用程序中使用 Handlebars 实现页面布局的教程

    Handlebars 是一个流行的 JavaScript 模板引擎,它非常适合用于 Express.js 应用程序中实现页面布局。在本教程中,我们将详细讲解如何使用 Handlebars 来创建可复用...

    8 天前
  • 如何在 Enzyme 中模拟 React 组件的单元测试?

    在现代 web 开发中,前端技术已经成为了软件开发中不可分割的一部分。在 web 前端开发中,jQuery 和原始的 JavaScript 越来越难以满足业务需求,因此,React 这种针对组件化开发...

    8 天前
  • MongoDB 内部存储格式探索

    MongoDB 是一款非常流行的 NoSQL 数据库,其内部存储格式对于理解 MongoDB 数据库的工作原理非常重要。本文将深入探讨 MongoDB 内部存储格式,让你从技术的角度理解 Mongo...

    8 天前
  • Mongoose 多语言查询时的注意事项

    Mongoose 是一个 Node.js 模块,提供了操作 MongoDB 数据库的功能。在使用 Mongoose 进行多语言查询时,有一些需要注意的事项。本文将会介绍这些注意事项,并提供相应的示例代...

    8 天前
  • 使用 Socket.io 实现在线商城的实时库存与价格更新

    前言 在在线商城中,实时更新库存和价格是必须的。这可以帮助客户了解商品的最新状态,同时也可以避免因为库存问题导致订单无法完成。实时更新价格则可以让客户了解到促销等信息,更有可能促使客户下单。

    8 天前
  • 如何解决 Node.js 中的 “Callback Hell” 问题

    在 Node.js 中使用异步回调函数是很常见的,但是当回调函数嵌套过多的时候,就会出现所谓的“Callback Hell”问题,使代码难以阅读和维护。本文将介绍一些技巧和库来解决该问题。

    8 天前
  • 响应式设计中怎样处理图片显示的失真问题?

    在响应式设计中,图片显示的失真问题是很常见的。这个问题的出现原因是因为在不同的设备上,图片的分辨率、尺寸和比例不同,而响应式布局会根据不同设备的屏幕大小来适配页面的样式和布局。

    8 天前
  • 使用 Custom Elements 实现异步标题滚动

    在网页设计中,滚动标题是一个经典的效果。它可以让网页更加生动有趣,增加用户体验。然而,很多传统的标题滚动方案都是基于 JavaScript 实现的,会造成阻塞加载的问题。

    8 天前
  • 在 React 项目中如何优化 Babel 编译 ES6 的速度

    在 React 项目中如何优化 Babel 编译 ES6 的速度 在现代的 React 项目中,ES6 已经成为了主流的开发语言,但是在编译过程中,Babel 会把 ES6 代码转换成 ES5 代码,...

    8 天前
  • RESTful API 设计中常见的版本控制问题及解决方案

    RESTful API 在互联网应用程序中越来越普遍,它通过 HTTP 协议提供了简单、轻量级、灵活的 API 实现方式。在 API 设计中,版本控制是很重要的一部分,因为它可以为不同版本的 API ...

    8 天前
  • ES11 的新特性:可选链路径操作符、空值合并运算符

    JavaScript 语言的版本更新是前端开发人员需要了解和掌握的重要内容。在 ES11 中,有两个新特性非常有用,分别是可选链路径操作符和空值合并运算符。 可选链路径操作符 在 JavaScript...

    8 天前
  • 使用 React Redux 和 Axios 进行 HTTP 请求

    随着前端技术的不断发展,现代Web应用的复杂度越来越高。其中,与后端进行HTTP请求(例如获取数据、发送表单等)是非常常见的操作。在此过程中,React Redux和Axios是两个重要的工具,它们可...

    8 天前
  • Material Design 中实现 SnackBar 提示框

    在移动端应用中,提醒用户进行交互或者传递信息是非常重要的。SnackBar 提示框是 Material Design 中提供的一种非常实用的组件,它通过一个简单的提示框展示消息和操作。

    8 天前
  • MongoDB 的批量插入性能测试与性能调优

    在开发中,我们常常需要将大量数据存储到数据库中。对于 MongoDB 这样的 NoSQL 数据库来说,批量插入是一种高效的方式。但是,在实际应用中,我们还需要考虑如何优化批量插入的性能。

    8 天前
  • Mongoose 事务的使用及示例

    在前端开发中,我们经常需要操作数据库来存储和读取数据。在 Node.js 中,MongoDB 是一个非常流行的数据库选择,而 Mongoose 是一个优秀的 Node.js 库,可以方便地与 Mong...

    8 天前
  • GraphQL 中使用 Subscription 时遇到客户端连接问题怎么办?

    随着互联网技术和开发方式的不断发展,前端技术的应用场景和方法也在不断变化。GraphQL 已成为现代 Web 应用程序的一项主流技术,它提供了一种更有效的方法来获取数据并与 API 进行交互。

    8 天前
  • 响应式设计中如何解决页面卡顿和闪烁问题?

    随着移动设备和不同屏幕尺寸的使用越来越广泛,响应式设计已成为现代前端开发的标准。然而,在实现响应式设计的过程中,卡顿和闪烁问题可能会在某些设计中出现。如何解决这些问题呢?本文将为你详细介绍一些解决方案...

    8 天前

相关推荐

    暂无文章