【问题标题】:Is there a way to setup a field-level authorisation on FaunaDB + GraphQL?有没有办法在 FaunaDB + GraphQL 上设置字段级授权?
【发布时间】:2020-06-08 12:30:27
【问题描述】:

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

这是我发现的一个示例,它创建了一个可以动态访问整个 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 字段? p>

我可以将User 集合分成两个:一个是公开的,另一个可供文档所有者访问,但这听起来不对。

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

【问题讨论】:

    标签: nosql graphql authorization faunadb


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我实际上按照你的建议做了,作为一个临时解决方案,直到找到隐藏字段的方法。但事实证明它已经足够好了,它完成了它的工作,加上你的回答让我确信这是正确的方法之一。感谢你的回复!稍后我会用代码 sn-ps 来回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2020-08-19
    • 1970-01-01
    • 2017-12-27
    • 2019-03-04
    • 1970-01-01
    相关资源
    最近更新 更多