简介
GraphQL 是一种用于 API 的查询语言,它允许客户端在一个请求中指定需要返回的数据,从而减少了 API 请求的数量。GraphQL 的一个重要特性是可以在查询中定义自定义授权规则,以确保只有授权的用户才能访问特定的数据。
本文将介绍如何在 GraphQL 中执行自定义授权,包括授权规则的定义和如何在 GraphQL 的解析器中实现授权逻辑。我们将使用一个简单的示例来演示如何实现自定义授权。
示例
我们将使用一个简单的博客应用程序作为示例。博客应用程序包含文章、评论和用户三个类型。每个文章和评论都可以被一个或多个用户所拥有。我们的目标是确保只有文章或评论的所有者才能编辑或删除它们。
首先,我们需要定义 GraphQL 模式来表示我们的数据类型。以下是我们的 GraphQL 模式:
-- -------------------- ---- ------- ---- ---- - --- --- ----- ------- - ---- ------- - --- --- ------ ------- -------- ------- ------- ----- -------- -------- - ---- ------- - --- --- -------- ------- ------- ----- -------- -------- -
我们可以看到,每个文章都有一个作者和一个编辑器列表,每个评论都有一个作者和一个文章。现在我们需要定义授权规则来确保只有文章或评论的所有者才能编辑或删除它们。
定义授权规则
我们将使用 GraphQL 的 directive
来定义授权规则。directive
是一种将元数据附加到 GraphQL 操作的方法。我们将使用 @auth
指令来定义授权规则。
以下是 @auth
指令的定义:
directive @auth( requires: Role = USER ) on FIELD_DEFINITION enum Role { ADMIN USER }
@auth
指令接受一个 requires
参数,该参数指定了需要的角色。我们定义了两个角色:ADMIN
和 USER
。默认情况下,requires
参数设置为 USER
,这意味着只有经过身份验证的用户才能访问该字段。如果我们将 requires
参数设置为 ADMIN
,则只有管理员才能访问该字段。
现在我们可以将 @auth
指令应用于我们的模式中的字段,以确保只有授权的用户才能访问它们。以下是我们如何在 Article
类型中应用 @auth
指令:
type Article { id: ID! title: String! content: String! author: User! editors: [User!]! @auth(requires: ADMIN) }
我们将 @auth
指令应用于 editors
字段,并将 requires
参数设置为 ADMIN
,这意味着只有管理员才能访问该字段。现在我们需要实现授权规则,以确保只有文章或评论的所有者才能编辑或删除它们。
实现授权规则
我们将使用 JavaScript 来实现授权规则。我们将在 GraphQL 的解析器中实现授权逻辑。以下是我们如何实现授权逻辑:
-- -------------------- ---- ------- ----- - ------------------- - - ------------------------- ----- --------- - - -------- - -------- --------- ----- -------- -- - -- ------------------ --- ------- -- ----------------- --- ---------------- - ----- --- ------------------------ --- --- ---------- -- ------ ---- -------- - ------ ---------------- -- -- -------- - ------- --------- ----- -------- -- - -- ------------------ --- ---------------- - ----- --- ------------------------ --- --- ---------- -- ------ ---- -------- - ------ --------------- -- -------- --------- ----- -------- -- - -- -------------------------- --- ---------------- - ----- --- ------------------------ --- --- ---------- -- ------ ---- -------- - ------ ---------------- -- -- --
我们在 Article
和 Comment
类型的解析器中实现了授权逻辑。对于 Article
类型的 editors
字段,我们检查用户是否具有管理员角色或是否是文章的所有者。对于 Comment
类型的 author
和 article
字段,我们检查用户是否是评论或文章的所有者。
如果用户未经授权访问该字段,我们将抛出一个 AuthenticationError
异常。这将导致 GraphQL 返回一个错误响应,告诉客户端用户未经授权访问该字段。
现在我们已经实现了自定义授权规则,我们可以使用以下查询来测试我们的授权规则:
-- -------------------- ---- ------- ----- - -------- - -- ----- ------- ------ - -- ---- - ------- - -- ---- - - -
如果我们尝试访问 editors
字段,但是没有管理员角色或不是文章的所有者,GraphQL 将返回一个错误响应。
结论
GraphQL 允许我们定义自定义授权规则,以确保只有授权的用户才能访问特定的数据。我们可以使用 @auth
指令来定义授权规则,并在 GraphQL 的解析器中实现授权逻辑。通过正确实现自定义授权规则,我们可以确保我们的应用程序是安全的,并且只有授权的用户才能访问敏感数据。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6724c64b2e7021665e1543c3