在开发 Web 应用程序的过程中,安全性是非常重要的一点。需要确保未经授权的用户无法访问敏感信息。在 GraphQL 中,实现定制化基于角色的访问控制也是一项很重要的工作。
本文将介绍如何使用 GraphQL 实现定制化基于角色的访问控制,以及如何在 GraphQL 架构中添加安全性。
GraphQL 访问控制
在实现 GraphQL 访问控制的过程中,需要执行以下步骤:
- 确定需要保护的字段和查询
- 确定哪些角色应该有权访问这些字段和查询
- 根据用户的角色和访问权限执行查询
以下是演示如何实现 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