【问题标题】:ABAC Permissions don't work the same for read and writeABAC 权限对读写的作用不同
【发布时间】:2020-02-22 03:10:14
【问题描述】:

我目前正在检查 FaunaDB 创建示例目标跟踪器(待办事项!)应用程序。使用 graphQL,我将架构创建为:

type Goal {
  title: String!
  completed: Boolean!
  owner: User!
}

type User {
  name: String!
  username: String! @unique
}

input GoalInput {
  title: String!
  completed: Boolean!
}

我想将 ABAC 权限设置为:

  1. 登录用户可以查看自己创建的目标。
  2. 登录的用户只能编辑自己创建的目标。

角色的权限已设置为:

{
   resource: Collection("Goal"),
   actions: {
     read: Query(
       Lambda("goalRef", Equals(Select(["data", "owner"], Get(Var("goalRef"))), Identity()))
     ),
     write: Query(
       Lambda("goalRef", Equals(Select(["data", "owner"], Get(Var("goalRef"))), Identity()))
     )
   }
}

虽然read 部分效果很好,但write 部分效果不佳。 updateGoal(由 FaunaDB 自动创建的变异)不断抛出权限不足的错误。

【问题讨论】:

    标签: faunadb


    【解决方案1】:

    只需上传您提供的架构,这是生成的GoalInput

    input GoalInput {
      title: String!
      completed: Boolean!
    }
    

    如果您无法使用 owner 字段创建新目标,则无法查询它们 -- owner 将是 null

    尝试更新您的架构以包含用户的目标字段,以获得您正在寻找的一对多关系。 (fauna docs)

    type User {
      name: String!
      username: String! @unique
      goals: [Goal] @relation
    }
    

    然后确保每次创建新目标时,都将所有者设置为您自己。

    交替使用函数

    您可以为createGoalForMe 创建一个自定义突变,它会自动将所有者字段设置为您。

    确保为新函数授予call 权限。

    检查权限

    写权限 lambda 接收 newData 和 oldData 作为参数。

    /*...*/
    {
      resource: Collection("Goal"),
      actions: {
        /*...*/
        write: Query(
          Lambda(
            ["oldData", "newData"],
            And(
              Equals(Identity(), Select(["data", "owner"], Var("oldData"))),
              Equals(
                Select(["data", "owner"], Var("oldData")),
                Select(["data", "owner"], Var("newData"))
              )
            )
          )
        )
      },
      /*...*/
    }
    /*...*/
    

    所以将"goalRef" 更改为["oldData", "newData"],我认为你应该拥有它。

    【讨论】:

    • 正如在架构中看到的Goal 字段具有owner 字段,只是GoalInput 类型没有。这是故意的,以便用户不提供所有者,这必须是隐含的
    • 然后您需要创建一个用户定义的函数,将 Identity 分配给 owner 字段。这不会自动发生。如果您使用内置的 createGoal 突变检查任何创建的目标,那么我怀疑您会发现 owner 字段没有任何价值,我认为这可能是您无法执行后续写入操作的原因。
    • 我确实定义了一个自定义的用户定义函数,它将owner 放入记录中。这就是为什么read 权限有效的原因,如果没有所有者,这将失败
    • 我再次查看了我的角色定义,我意识到您传递给 lambda 的参数不正确。写入操作接收 2 个参数。
    猜你喜欢
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多