ABAC 权限对读和写的作用不同

ABAC Permissions don't work the same for read and write

我目前正在查看 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 自动创建的变异)不断抛出权限不足的错误。

只需上传您提供的架构,这里是 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"],我认为你应该拥有它。