首页 > 解决方案 > 有没有办法在 FaunaDB + GraphQL 上设置字段级授权?

问题描述

我很难找到一种方法来隐藏所有人的用户电子邮件,除了所有者(用户只能访问他的电子邮件)。有没有办法为某些角色隐藏某个文档字段?

这是我发现的一个示例,它创建了一个可以动态访问整个User集合的角色:

CreateRole({
  name: "tier1_role",
  membership: {
    resource: Collection("User"),
    predicate: Query(
      Lambda("userRef",
        // User attribute based rule:
        // It grants access only if the User has TIER1 role.
        // If so, further rules specified in the privileges
        // section are applied next.
        Equals(Select(["data", "role"], Get(Var("userRef"))), "TIER1")
      )
    )
  },
  privileges: [
    {
      // Note: 'allUsers' Index is used to retrieve the
      // documents from the File collection. Therefore,
      // read access to the Index is required here as well.
      resource: Index("allUsers"),
      actions: { read: true }
    }
  ]
})

我尝试对其进行一些更改,但无法设置字段级访问。

假设我在下面使用 GraphQL 模式设置了 FaunaDB。

enum UserRole {
  TIER1
}

type User {
  email: String! @unique
  username: String! @unique
  role: UserRole!
}

type Query {
  allUsers: [User!]
}

type Mutation {
  addUsers(new_users: [UserInput]): [User]
    @resolver(name: "add_users", paginated: false)
}

如何创建一个 FaunaDB 角色,以使查询结果数组中的所有用户(当前用户除外allUsers)都没有email字段?

我可以将User集合分为两种:一种是公开的,另一种可供文档所有者访问,但这听起来是错误的。

我是 noSQL 概念的新手,所以也许我从错误的角度看待这个问题?

标签: nosqlgraphqlauthorizationfaunadb

解决方案


这是一个出现了几次的请求。您可能希望直接在 FaunaDB 的 ABAC 角色系统中执行此操作,但尽管它提供行级安全性,但目前尚未提供隐藏特定字段。反馈已被记录,我们将对其进行调查。

当前执行此操作的方法是将用户从帐户中分离出来并获取用户而不是帐户。将来有类似隐藏字段的东西会很有用。

如果您考虑一下,在这种情况下,将身份验证信息与用户信息分开是有意义的。您永远不知道将来您可能会提供另一种身份验证方式。我仍然记得 Phoenix Framework 的书,他们在那里做得很好,并认为这是一种很好的做法。

您还可以在无服务器函数中使用 Apollo 制作一个瘦包装器,并在传递结果时过滤掉这些字段。有一个指南解释了如何构建这样一个瘦 Apollo 中间件,它只是委托给 FaunaDB https://www.gatlin.io/blog/post/social-login-with-faunadb-and-auth0


推荐阅读