npm 包 graphql-shield 使用教程

阅读时长 6 分钟读完

GraphQL 在现代 Web 开发中越来越受欢迎,但是访问控制是每个 GraphQL 应用都需要的一个关键方面。graphql-shield 是一个流行的 npm 包,它可以帮助我们轻松地保护我们的 GraphQL API。

什么是 graphql-shield?

graphql-shield 是一个用于基于角色及权限的访问控制中间件,它采用类似于 Express 中间件的方式来编写安全控制规则。graphql-shield 是与任何 GraphQL 求解器(例如 Apollo Server 、 graphql-yoga )兼容的。

如何使用 graphql-shield?

首先,我们需要安装 graphql-shield 包:

接下来,让我们编写我们的安全规则。

编写安全规则

graphql-shield 安全规则是基于 graphql.js 的解析器进行编写的。

安全规则有一组可用的 API。 下面是一些最常用的:

  • allow:允许访问特定字段或查询。
  • deny:拒绝访问特定字段或查询。
  • and:将多个规则组合在一起,所有规则都必须通过才能允许访问。
  • or:将多个规则组合在一起,只需要任何规则通过就可以允许访问。
  • not:否认某些规则的结果,允许不符合这些规则但不被其他规则拒绝的访问。

下面是一个简单的安全规则,仅允许经过身份验证的用户获取文章列表:

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

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

如这个示例中,我们创建了一个名为 isAuthenticated 的规则,并将其应用于 posts 查询字段。 此规则检查用户是否已通过身份验证,如果未通过身份验证,则返回错误。

我们还使用 shield 函数将 permissions 变量与我们的 GraphQL 解析器结合在一起。这个函数将返回一个中间件,该中间件将在 Apollo Server 中使用。

在 Apollo Server 中,使用解析器和中间件

我们现在有了一些安全规则,现在我们需要创建一个GraphQL解析器,并且用 graphql-shield 中间件来保护我们的API。

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

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

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

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

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

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

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

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

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

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

在上面的代码中,我们将 permissions 变量作为我们的 GraphQL 解析器和中间件之间的参数传入了 applyMiddleware 这个函数中,这样就会创建一个新的 GraphQL 解析器,它已被 graphql-shield 中间件保护起来了。

现在,我们已经配置完成了,可以启动服务器并开始测试我们的 API。

测试

当未通过身份验证时,访问我们的 /posts 查询应该返回错误。

当通过身份验证时,访问 /posts 查询应该返回帖子列表。

总结

正如我们所看到的,使用 graphql-shield 包非常容易,任何开发人员都可以轻松地创建一个安全的 GraphQL API。希望本文能够对你有所帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/93598