GraphQL 是一种用于 API 的查询语言,它使得客户端能够精确地指定它需要的数据。GraphQL 不仅能够提高 API 的效率,还能够提供更好的数据安全性。本文将介绍 GraphQL 中的权限控制实践,包括如何定义 permission,并在 GraphQL 中使用。
1. 定义 permission
在 GraphQL 中,权限控制是通过 permission 来实现的。permission 是一个函数,它接受一个 context 对象作为参数,返回一个布尔值。如果返回值为 true,则表示当前用户有权限访问该字段或类型;如果返回值为 false,则表示当前用户没有权限访问该字段或类型。
我们可以在 GraphQL 的 schema 中定义 permission,如下所示:
type Query { users: [User] @permission(requires: ["admin"]) } type Mutation { createUser(input: UserInput!): User @permission(requires: ["admin"]) }
在上面的示例中,我们定义了两个 permission,一个用于 Query 中的 users 字段,另一个用于 Mutation 中的 createUser 字段。这两个 permission 都要求用户具有 admin 权限才能访问。
2. 在 GraphQL 中使用 permission
在 GraphQL 中使用 permission,需要借助于一个中间件。我们可以使用 graphql-middleware 来实现中间件。
首先,我们需要安装 graphql-middleware:
npm install graphql-middleware
然后,我们可以定义一个中间件,如下所示:
-- -------------------- ---- ------- ----- - --------------- - - ------------------------------ ----- - -------------------- - - ------------------------- ----- - ----- ------ - - -------------------------- ----- -------- - - ---- ----- - ------ ------ - ---- -------- - ----------------- ------------ ---- - ---- ---- - --- --- ----- ------- ------ ------- - ----- --------- - ----- ------- ------ ------- - -- ----- --------- - - ------ - ------ -- -- -- --- ---- ----- -------- ------ ------------------- -- -- --------- - ----------- --- - ----- -- -- -- --- ---- -------- -- - -- ----- --------------- - ------ ------ ------------ --- ----- -------- ----- - ---- -- ----- -- - ------ ---- --- ----- -- -- ----- ------- - ------ ------ ------------ --- ----- -------- ----- - ---- -- ----- -- - ------ --------- --- -------- -- -- ----- ----------- - -------- ------ - ------ --------------- -- --------- - ----------- ------- - --- ----- ------ - ---------------------- --------- ---------- --- ----- -------------------- - ----------------------- ------------- -------------- - ---------------------
在上面的示例中,我们定义了两个 rule:isAuthenticated 和 isAdmin。isAuthenticated 用于验证用户是否已经登录,isAdmin 用于验证用户是否具有 admin 权限。然后,我们使用 shield 函数来将这些 rule 与 schema 中的字段关联起来,从而实现权限控制。
最后,我们使用 applyMiddleware 函数将 schema 和 permissions 中间件关联起来,从而得到最终的 schemaWithMiddleware。
3. 示例代码
下面是一个完整的示例代码,它演示了如何在 GraphQL 中使用 permission 来实现权限控制:
-- -------------------- ---- ------- ----- - --------------- - - ------------------------------ ----- - -------------------- - - ------------------------- ----- - ----- ------ - - -------------------------- ----- -------- - - ---- ----- - ------ ------ --------------------- ---------- - ---- -------- - ----------------- ------------ ---- --------------------- ---------- - ---- ---- - --- --- ----- ------- ------ ------- - ----- --------- - ----- ------- ------ ------- - -- ----- --------- - - ------ - ------ -- -- -- --- ---- ----- -------- ------ ------------------- -- -- --------- - ----------- --- - ----- -- -- -- --- ---- -------- -- - -- ----- --------------- - ------ ------ ------------ --- ----- -------- ----- - ---- -- ----- -- - ------ ---- --- ----- -- -- ----- ------- - ------ ------ ------------ --- ----- -------- ----- - ---- -- ----- -- - ------ --------- --- -------- -- -- ----- ----------- - -------- ------ - ------ --------------- -- --------- - ----------- ------- - --- ----- ------ - ---------------------- --------- ---------- --- ----- -------------------- - ----------------------- ------------- -------------- - ---------------------
在上面的示例代码中,我们定义了两个 permission,一个用于 Query 中的 users 字段,另一个用于 Mutation 中的 createUser 字段。这两个 permission 都要求用户具有 admin 权限才能访问。
我们还定义了两个 rule:isAuthenticated 和 isAdmin。isAuthenticated 用于验证用户是否已经登录,isAdmin 用于验证用户是否具有 admin 权限。然后,我们使用 shield 函数将这些 rule 与 schema 中的字段关联起来,从而实现权限控制。
最后,我们使用 applyMiddleware 函数将 schema 和 permissions 中间件关联起来,从而得到最终的 schemaWithMiddleware。
4. 总结
本文介绍了 GraphQL 中的权限控制实践,包括如何定义 permission,并在 GraphQL 中使用。通过使用 permission,我们可以精确地控制每个字段或类型的访问权限,从而提高 API 的安全性。同时,我们还介绍了 graphql-middleware 和 graphql-shield 这两个工具,它们可以方便地实现权限控制。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/660a7eeed10417a222a17f7f