GraphQL 权限控制实践:定义 permission、在 GraphQL 中使用

阅读时长 7 分钟读完

GraphQL 是一种用于 API 的查询语言,它使得客户端能够精确地指定它需要的数据。GraphQL 不仅能够提高 API 的效率,还能够提供更好的数据安全性。本文将介绍 GraphQL 中的权限控制实践,包括如何定义 permission,并在 GraphQL 中使用。

1. 定义 permission

在 GraphQL 中,权限控制是通过 permission 来实现的。permission 是一个函数,它接受一个 context 对象作为参数,返回一个布尔值。如果返回值为 true,则表示当前用户有权限访问该字段或类型;如果返回值为 false,则表示当前用户没有权限访问该字段或类型。

我们可以在 GraphQL 的 schema 中定义 permission,如下所示:

在上面的示例中,我们定义了两个 permission,一个用于 Query 中的 users 字段,另一个用于 Mutation 中的 createUser 字段。这两个 permission 都要求用户具有 admin 权限才能访问。

2. 在 GraphQL 中使用 permission

在 GraphQL 中使用 permission,需要借助于一个中间件。我们可以使用 graphql-middleware 来实现中间件。

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

然后,我们可以定义一个中间件,如下所示:

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

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

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

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

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

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

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

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

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

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

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

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

在上面的示例中,我们定义了两个 rule:isAuthenticated 和 isAdmin。isAuthenticated 用于验证用户是否已经登录,isAdmin 用于验证用户是否具有 admin 权限。然后,我们使用 shield 函数来将这些 rule 与 schema 中的字段关联起来,从而实现权限控制。

最后,我们使用 applyMiddleware 函数将 schema 和 permissions 中间件关联起来,从而得到最终的 schemaWithMiddleware。

3. 示例代码

下面是一个完整的示例代码,它演示了如何在 GraphQL 中使用 permission 来实现权限控制:

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

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

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

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

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

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

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

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

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

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

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

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

在上面的示例代码中,我们定义了两个 permission,一个用于 Query 中的 users 字段,另一个用于 Mutation 中的 createUser 字段。这两个 permission 都要求用户具有 admin 权限才能访问。

我们还定义了两个 rule:isAuthenticated 和 isAdmin。isAuthenticated 用于验证用户是否已经登录,isAdmin 用于验证用户是否具有 admin 权限。然后,我们使用 shield 函数将这些 rule 与 schema 中的字段关联起来,从而实现权限控制。

最后,我们使用 applyMiddleware 函数将 schema 和 permissions 中间件关联起来,从而得到最终的 schemaWithMiddleware。

4. 总结

本文介绍了 GraphQL 中的权限控制实践,包括如何定义 permission,并在 GraphQL 中使用。通过使用 permission,我们可以精确地控制每个字段或类型的访问权限,从而提高 API 的安全性。同时,我们还介绍了 graphql-middleware 和 graphql-shield 这两个工具,它们可以方便地实现权限控制。

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

纠错
反馈