如何在 GraphQL 中实现权限控制

面试官:小伙子,你的数组去重方式惊艳到我了

GraphQL 是一种描述 API 的查询语言,它提供了一种灵活而强大的方式来定义和查询 API 的数据。然而,随着应用程序的复杂度增加,如何实现一个安全的 GraphQL API,包括权限控制和安全性,变得越来越重要。本文将介绍如何在 GraphQL 中实现权限控制。

GraphQL 的权限控制基础

在 GraphQL 中权限控制通常是在服务器端进行的。在 GraphQL 中,每个操作被定义为一个解析函数,该函数将处理查询请求并生成响应。通过拦截解析函数,我们可以实现权限控制。在一个简单的基于角色的授权模型中,我们可以检查当前用户的角色是否允许他或她执行特定的操作。

例如,下面是一个模拟的用户模型,其中包含了三种角色:管理员,编辑者和读者。用户可以查询所有文章,并且管理员和编辑者可以进行编辑和删除操作。

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

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

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

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

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

实现权限控制

拦截解析函数

为了实现权限控制,我们需要拦截解析函数并检查当前用户是否有足够的权限执行该操作。GraphQL 提供了一种称为“schema 指令”的机制,使我们能够为类型、字段和参数附加元数据。我们可以使用 schema 指令来指定哪些查询和突变需要权限。

首先,我们需要定义一个权限错误类型。

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

然后我们可以定义一个权限指令,它将检查当前用户是否属于指定的角色。

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

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

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

为了实现权限控制,我们需要编写一个中间件函数,它将拦截所有解析请求并检查当前用户是否有足够的权限执行该请求。为了演示目的,我们将使用一个简单的基于 JSON Web Token(JWT)的身份验证机制。

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

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

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

我们可以将此中间件函数添加到我们的 GraphQL 服务器中。

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

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

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

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

现在我们的 GraphQL API 将检查授权标头并拒绝没有足够权限的用户执行查询或突变请求。

结论

GraphQL 提供了一个灵活而强大的机制来定义和查询 API 的数据。但是,随着应用程序的复杂和数据的安全性和隐私性的增加,如何实现一个安全的 GraphQL API 变得越来越重要。通过制定权限控制策略并使用 GraphQL schema 指令和中间件函数,我们可以确保只有有权用户才能访问特定的查询和突变请求。

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


猜你喜欢

  • 为你的应用程序添加 Sequelize

    简介 在开发 Web 应用程序和其他服务器端应用程序时,我们需要对数据库进行规划和管理。 Sequelize 是一个基于 Promise 的 ORM(对象关系映射)工具,专门用于 Node.js。

    18 天前
  • Serverless 如何实现函数版本控制?

    Serverless 架构已经成为了一个非常流行的开发模式,它可以让开发者更专注于业务逻辑的实现,而减少了对于基础设施的考虑。在 Serverless 架构中,我们通常是以函数为单位进行开发和部署的,...

    18 天前
  • Enzyme + React Native: 如何测试多个屏幕的 React Navigation 应用

    Enzyme + React Native: 如何测试多个屏幕的 React Navigation 应用 在 React Native 开发中,导航是一个非常重要的组件。

    18 天前
  • 如何在 Chai 中测试 Redux 的 action 和 reducer

    Redux 是一个轻量级的状态容器,它让前端的应用程序易于管理复杂的状态。Redux 由 action,reducer 和 store 构成。开发者可以使用不同的测试库测试这些不同的部分。

    18 天前
  • 如何在 Koa2 中使用 MongoDB 进行数据存储及操作

    随着前端技术的快速发展,一些服务端的功能也开始逐渐转移到前端。前端技术人员需要学习服务器端技术,并尤其需要了解数据库存储和操作知识。在这篇文章中,我们将会探讨如何在 Koa2 中使用 MongoDB ...

    18 天前
  • 在 TailwindCSS 中实现多语言切换的方法

    在开发网站或应用程序时,支持多种语言是一项非常重要的功能。在 TailwindCSS 中,实现多语言切换是一项非常简单的任务,本文将向您展示如何使用 TailwindCSS 实现多语言支持。

    18 天前
  • React 中使用 CSS Modules:样式和组件分离

    在 React 中,组件是开发应用的主要构建块。为了增加代码的可维护性和可复用性,我们需要将组件的样式和组件本身分离开来。在这篇文章中,我们将介绍如何使用 CSS Modules 在 React 中实...

    18 天前
  • Cypress 错误解决:如何解决 Cypress 安装错误

    Cypress 是一种流行的前端自动化测试工具,它易于使用,具有快速运行和实时监控的优点。然而,安装 Cypress 时,经常会遇到一些错误,例如安装失败,打开浏览器错误等等。

    18 天前
  • Javascript ES8 新特性:带上异步处理工作的新时代

    Javascript ES8(又称 ECMAScript 2017)是 Javascript 语言的一个重要版本,它引入了很多有用的新特性,其中最重要的一项是异步函数(Async Functions)...

    18 天前
  • Express.js 和 Socket.io 的完整指南:实时 Web 应用

    前言 随着互联网技术的不断发展,实时 Web 应用开始成为一个热门话题,前端工程师需要掌握相关技术来构建这种类型的应用程序。 本篇文章将着重介绍 Express.js 和 Socket.io 这两个热...

    18 天前
  • 如何在 AngularJS 中实现无障碍访问?

    无障碍访问是在设计和开发 web 应用程序时要考虑到的关键问题。它不仅有助于满足 ADA 和其他无障碍法规的要求,还使您的应用程序更易于使用,扩展,并增加了各种用户组的访问性。

    18 天前
  • JestES6 语法中使用 import 出现 “SyntaxError: Unexpected identifier” 提示解决方案

    Jest ES6 语法中使用 import 出现 “SyntaxError: Unexpected identifier” 提示解决方案 前言 随着 JavaScript 不断地普及,ES6 已经成为...

    18 天前
  • Babel 编译 React Native 应用的技巧

    React Native 是一种非常受欢迎的移动端开发框架,它使用了许多 ECMAScript2015(ES6) 的新特性,如箭头函数,模板字符串和类。然而,这些新特性并不是所有浏览器和移动设备所支持...

    18 天前
  • 如何在 Flutter 中集成 TailwindCSS

    Flutter 是一款跨平台的开源移动应用程序框架,由 Google 推出。它通过一种名为“声明式UI”的方式帮助开发者在多个平台上开发高质量的应用程序。Flutter 还支持许多丰富的 UI 库和框...

    18 天前
  • 如何在 Headless CMS 中实现 OAuth 认证

    如何在 Headless CMS 中实现 OAuth 认证 OAuth 是一种流行的授权方法,现已被广泛应用于多个应用程序。它使得应用程序可以通过用户的代理与第三方 Web 服务进行沟通,而无需请求用...

    18 天前
  • 如何使用 Cypress 进行 Websocket 测试

    在现代 Web 应用程序中,Websocket 已成为一个常见的通信协议,用于实时消息传递、在线协作和多人游戏等方面。在实际开发中,我们需要对 Websocket 进行测试,以保证应用程序的稳定性和正...

    18 天前
  • 从 Web 到 PWA,如何实现用户的无感知升级

    前言 在 Web 应用程序的历史中,向用户提供全功能的应用程序一直是一个挑战。这一直是因为浏览器的限制以及当时 Web 技术的限制。但现在随着 PWA 技术的发展,我们可以使用 Web 技术提供一个完...

    18 天前
  • Web Components 中的事件处理机制详解

    Web Components 技术是一种用于创建可重用、封装化自定义元素的标准,它由一系列 API、语法和规则组成。在 Web Components 中,事件处理机制也是非常重要的一部分,本文将详细介...

    18 天前
  • Node.js 中的调试技巧及其应用实例

    在 Node.js 开发中,调试一直是一个挑战,因为许多错误是由异步调用和事件驱动程序造成的。但幸运的是,Node.js 内置了一些调试工具和技巧,使我们能够更轻松地排除故障并优化应用程序性能。

    18 天前
  • Kubernetes 中状态管理器 StatefulSet 权限控制教程

    在 Kubernetes 中,StatefulSet 是一种常见的状态管理器,用于管理一组有状态的应用程序实例。然而,对于一个生产级别的 Kubernetes 集群,需要一些措施来确保安全和可靠性。

    18 天前

相关推荐

    暂无文章