1

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

4

1 回答 1

1

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

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

如果您无法使用该owner字段创建新目标,则无法查询它们——ownernull

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

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"],我认为您应该拥有它。

于 2020-02-20T19:18:38.360 回答