GraphQL是目前非常流行的API查询语言和运行环境,它为构建服务化的应用程序提供了极大的便利性。尽管GraphQL为我们提供了强大的查询功能,但对于许多开发人员而言,它可能会带来一些麻烦,例如如何控制哪些API可以被调用以及如何过滤出不需要的数据。这正是GraphQL ACL(访问控制列表)npm包的用处所在,它提供了一种可靠的方式来解决这类问题。
安装 graphql-acl
首先,我们需要在我们的项目中安装graphql-acl。通过运行以下命令完成安装:
npm install graphql-acl
如何使用graphql-acl
graphql-acl 提供了一些方法来进行API授权。一般情况下,这涉及到全局方面(如禁用所有查询和突变)或为某个特定查询或突变授予权限。通常,ACL都是定义在应用程序中,当你使用graphql-acl时,你需要明确地传递一个回调函数来确定某个操作是否有权被执行。下面是一个具体的示例:
-- -------------------- ---- ------- -- ---------- ------- -------- ----- - ------------- - - ----------------------- ----- - ----- - - ---------------------- ----- ------------ - ----- ---- -- - -- --- --- --- ---- --- ----- ---- -- ----- -- --- ------------- ---- -- ---------- -- ------- --- --------- ------ ------ ---- -- ---------- ---- - ----- -------- - ----- -- -- ------- ------ --- ----- --------- - ----- -- -- ------- -------- --- ----- ------ - --- --------------- --------- ---------- ------------ - -- ------------------ ------------------- - -- --------------- -- ---------------------------------
在这个示例中,我们将ACL规则作为中间件添加到GraphQL服务器的功能中。ACL规则通过isAuthorized回调函数提供,该函数在每个请求的时候会被调用。在这个特定示例中,我们只是简单地返回 true,以表明用户有权执行该操作。实际情况下,你应该在此回调函数中编写你自己的逻辑来检查用户具有哪些权限。
示例
为了说明graphql-acl的真实用例,我们将创建一个简单的电子商务API,该API允许用户通过查询所有产品或查询特定产品来浏览我们的商店。
为了在中间件中使用graphql-acl,我们首先需要定义一个规则。下面是基本的ACL规则:
-- -------------------- ---- ------- ----- - ----- ------ - - ---------------------- ----- --------------- - ------ ------ ------------ --- ----- -------- ----- - ---- -- ----- -- - ------ ---- --- ---- - - ----- ----------- - -------- ------ - ---- --------------- -- --------- - ---- --------------- - --
在这里,我们定义了一个名为isAuthenticated的规则,该规则通过检查上下文中的用户来验证是否可以访问某个查询或突变。然后,我们可以将该规则应用到验证整个查询的所有节点,如下所示:'Query \ *'。对于我们的示例,这表示用户必须先进行身份验证,然后才能查看所有产品。我们假设你已经了解了GraphQL的基础知识。这里只提供代码示例。
-- -------------------- ---- ------- ----- -------- - - ---- ----- - --------- ----------- ----------- ----- -------- - ---- ------- - --- --- ----- ------- ------------ ------ ------ ------ - ---- -------- - ---------------- -------- ------------ ------- ------ -------- -------- - - --- -------- - - - --- ---- ----- ---------- ------------ -- ------ ---- -- ------- ------ ---- -- - --- ---- ----- -------- -------- ------------ -- ------ ---- -- ----------- ------ ---- -- - --- ---- ----- ------------- ------------ -- ------ ------- ------ ---- ------ --- - - ----- --------- - - ------ - --------- -------- ----- ---- -- - ------ -------- -- -------- -------- - -- -- ---- -- - ------ --------------------- -- ---------- --- --- - -- --------- - ----------- -------- - ----- ------------ ----- -- ---- -- - ----- ---------- - - --- ------------------------ - ------------------ ----- ------------ ------ - ------------------------- ------ ---------- - - - ----- ------ - --- --------------- --------- ---------- ------------ - ----------- - -- --------------- -- ------------------- -- ------- -- -----------------
在上面的示例中,我们定义了API的类型及其所包含的查询和突变。然后我们使用JavaScript数组定义一些产品,这里我们定义了三个产品,分别由苹果、微软和谷歌制造。我们还定义了解析程序,这些解析程序为API中可用的查询或突变提供实现。
最后,我们通过实例化GraphQLServer类并将我们的类型定义及解析程序传递给它来启动服务器。我们还传递了一个中间件数组,该数组包含我们的规则。通过在中间件中使用shield函数来组合这些规则,我们确保只有身份验证的用户才能调用API。
结论
使用graphql-acl,我们可以有效地管理我们的API,确保只有经过身份验证且有权限的用户才能访问相关查询和突变。通过在GraphQL服务器中使用middleware钩子,我们可以轻松地将规则作为中间件添加到我们的代码中。由于graphql-acl是一个非常流行的npm包,因此可以快速集成到任何GraphQL API中。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60055aa681e8991b448d826c