如何在 GraphQL 中实现权限控制

阅读时长 7 分钟读完

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

纠错
反馈