如何在 GraphQL 中实现定制化基于角色的访问控制

阅读时长 5 分钟读完

在开发 Web 应用程序的过程中,安全性是非常重要的一点。需要确保未经授权的用户无法访问敏感信息。在 GraphQL 中,实现定制化基于角色的访问控制也是一项很重要的工作。

本文将介绍如何使用 GraphQL 实现定制化基于角色的访问控制,以及如何在 GraphQL 架构中添加安全性。

GraphQL 访问控制

在实现 GraphQL 访问控制的过程中,需要执行以下步骤:

  1. 确定需要保护的字段和查询
  2. 确定哪些角色应该有权访问这些字段和查询
  3. 根据用户的角色和访问权限执行查询

以下是演示如何实现 GraphQL 访问控制的示例:

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

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

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

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

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

在上面的代码中,定义了两个查询:publicFields 和 privateFields,其中 privateFields 使用 @auth 指令来设置需要 ADMIN 角色的访问权限。还定义了一个角色枚举类型(Role)和一个用户对象(User)。在最后的 schema 中,设置查询类型为 Query。

对于每个查询,需要在服务器端实现 @auth 指令。当用户执行查询时,服务器会检查用户的角色是否拥有该查询的访问权限。如果用户拥有读取私有字段的权限,则查询将返回 privateFields 的值。否则,查询将返回错误。

以下是演示如何实现 @auth 指令和基于角色的访问控制的示例:

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

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

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

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

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

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

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

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

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

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

在上面的代码中,定义了一个 AuthDirective 类来实现 @auth 指令,并在查询中使用它。在 AuthDirective 类中,visitFieldDefinition 方法将检查用户是否已登录以及用户是否拥有该查询的访问权限。如果用户没有登录,则抛出错误。如果用户未被授予查询的访问权限,则抛出错误。否则,将调用默认的字段解析程序以返回查询结果。

最后,将 AuthDirective 导出并将其添加到 ApolloServer 的 schemaDirectives 中。在 server.listen 中,使用 getUser 函数获取用户的身份验证信息并添加到上下文参数中,以便在 AuthDirective 中使用。

结论

在本文中,我们讨论了如何使用 GraphQL 实现定制化基于角色的访问控制,并展示了一个实际的示例。在实现 Web 应用程序时,安全性是必不可少的,而在 GraphQL 中实现安全性需要谨慎对待。使用本文中提供的方法,您可以添加必要的安全性以确保您的 GraphQL 应用程序是安全的。

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

纠错
反馈