GraphQL 在现代 Web 开发中越来越受欢迎,但是访问控制是每个 GraphQL 应用都需要的一个关键方面。graphql-shield
是一个流行的 npm 包,它可以帮助我们轻松地保护我们的 GraphQL API。
什么是 graphql-shield?
graphql-shield
是一个用于基于角色及权限的访问控制中间件,它采用类似于 Express 中间件的方式来编写安全控制规则。graphql-shield
是与任何 GraphQL 求解器(例如 Apollo Server 、 graphql-yoga )兼容的。
如何使用 graphql-shield?
首先,我们需要安装 graphql-shield
包:
npm i graphql-shield
接下来,让我们编写我们的安全规则。
编写安全规则
graphql-shield
安全规则是基于 graphql.js 的解析器进行编写的。
安全规则有一组可用的 API。 下面是一些最常用的:
allow
:允许访问特定字段或查询。deny
:拒绝访问特定字段或查询。and
:将多个规则组合在一起,所有规则都必须通过才能允许访问。or
:将多个规则组合在一起,只需要任何规则通过就可以允许访问。not
:否认某些规则的结果,允许不符合这些规则但不被其他规则拒绝的访问。
下面是一个简单的安全规则,仅允许经过身份验证的用户获取文章列表:
-- -------------------- ---- ------- ----- --------------- - ------ ------ ------------ --- ----- -------- ----- - ---- -- ----- -- - -- ------- - ------ --- ---------- ---------------- - -- -- ----- ----------- - -------- ------ - ------ ---------------- -- ---
如这个示例中,我们创建了一个名为 isAuthenticated
的规则,并将其应用于 posts
查询字段。 此规则检查用户是否已通过身份验证,如果未通过身份验证,则返回错误。
我们还使用 shield
函数将 permissions
变量与我们的 GraphQL 解析器结合在一起。这个函数将返回一个中间件,该中间件将在 Apollo Server 中使用。
在 Apollo Server 中,使用解析器和中间件
我们现在有了一些安全规则,现在我们需要创建一个GraphQL解析器,并且用 graphql-shield
中间件来保护我们的API。
-- -------------------- ---- ------- ----- - ------------ - - ------------------------- ----- - -------------------- - - ------------------------- ----- - --------------- - - ------------------------------ ----- - ------ - - -------------------------- ----- -------- - - ---- ----- - ------ -------- ---------------- ----- ----------- - ---- ---- - --- --- ------ ------- -------- ------- ------- ------- - ---- ------- - --- --- ------- --- -------- ------- - -- ----- --------- - - ------ - ------ -- -- ------ --------- -------- ----- -- ----------------------- -- -------------- --- --------- -- -- ----- --------------- - ------ ------ ------------ --- ----- -------- ----- - ---- -- ----- -- - -- ------- - ------ --- ---------- ---------------- - -- -- ----- ----------- - -------- ------ - ------ ---------------- -- --- ----- ------ - ---------------------- --------- --------- --- ----- -------------------- - ----------------------- ------------- ----- ------ - --- -------------- ------- --------------------- -------- -- --- -- -- - ----- ---- - ----------------------------------- ------ - ---- -- -- --- ----------------------- --- -- -- - --------------- ------ ----- -- --------- ---
在上面的代码中,我们将 permissions
变量作为我们的 GraphQL 解析器和中间件之间的参数传入了 applyMiddleware
这个函数中,这样就会创建一个新的 GraphQL 解析器,它已被 graphql-shield
中间件保护起来了。
现在,我们已经配置完成了,可以启动服务器并开始测试我们的 API。
测试
当未通过身份验证时,访问我们的 /posts
查询应该返回错误。
当通过身份验证时,访问 /posts
查询应该返回帖子列表。
总结
正如我们所看到的,使用 graphql-shield
包非常容易,任何开发人员都可以轻松地创建一个安全的 GraphQL API。希望本文能够对你有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/93598