0

我正在构建一个示例应用程序来评估 FaunaDB 和 Nextjs

我的计划是让 Web 应用程序单独进行身份验证,然后在 FaunaDB 上创建用户,然后在 FaunaDB 上创建一个令牌,并允许用户通过他自己的秘密令牌进行连接

我相信我在正确的轨道上让这个模型工作,但我面临着 FaunaDB 中的自定义角色的问题

数据模型是User -> Board -> Tasks,在这个问题中我将使用对boards的访问

这是自定义角色的代码

{
  ref: Role("Free_Tier_Role"),
  ts: 1601934616790000,
  name: "Free_Tier_Role",
  membership: [
    {
      resource: Collection("user"),
      predicate: Query(
        Lambda("ref", Select(["data", "isEnabled"], Get(Var("ref"))))
      )
    }
  ],
  privileges: [
    {
      resource: Collection("user"),
      actions: {
        read: true,
        write: false,
        create: false,
        delete: false,
        history_read: false,
        history_write: false,
        unrestricted_read: false
      }
    },
    {
      resource: Collection("board"),
      actions: {
        read: Query(
          Lambda(
            "ref",
            Equals(Identity(), Select(["data", "owner"], Get(Var("ref"))))
          )
        ),
        write: Query(
          Lambda(
            ["oldData", "newData"],
            And(
              Equals(
                Select("id", Identity()),
                Select(["data", "owner"], Var("oldData"))
              ),
              Equals(
                Select(["data", "owner"], Var("oldData")),
                Select(["data", "owner"], Var("newData"))
              )
            )
          )
        ),
        create: Query(
          Lambda(
            "newData",
            And(
              Equals(Identity(), Select(["data", "owner"], Var("newData"))),
              LT(Count(Match(Index("board_by_owner"), Identity())), 3)
            )
          )
        ),
        delete: Query(
          Lambda(
            "ref",
            Equals(Identity(), Select(["data", "owner"], Get(Var("ref"))))
          )
        ),
        history_read: false,
        history_write: false,
        unrestricted_read: false
      }
    },
    {
      resource: Collection("task"),
      actions: {
        read: Query(
          Lambda(
            "ref",
            Equals(Identity(), Select(["data", "owner"], Get(Var("ref"))))
          )
        ),
        write: Query(
          Lambda(
            ["oldData", "newData"],
            And(
              Equals(
                Select("id", Identity()),
                Select(["data", "owner"], Var("oldData"))
              ),
              Equals(
                Select(["data", "owner"], Var("oldData")),
                Select(["data", "owner"], Var("newData"))
              )
            )
          )
        ),
        create: Query(
          Lambda(
            "newData",
            And(
              Equals(Identity(), Select(["data", "owner"], Var("newData"))),
              LT(Count(Match(Index("task_by_owner"), Identity())), 10)
            )
          )
        ),
        delete: Query(
          Lambda(
            "ref",
            Equals(Identity(), Select(["data", "owner"], Get(Var("ref"))))
          )
        ),
        history_read: false,
        history_write: false,
        unrestricted_read: false
      }
    },
    {
      resource: Index("task_by_owner"),
      actions: {
        unrestricted_read: false,
        read: false
      }
    },
    {
      resource: Index("board_by_owner"),
      actions: {
        unrestricted_read: false,
        read: false
      }
    }
  ]
}

我面临的问题是 当我通过用户令牌登录并且该用户是董事会的所有者时,我得到一个空列表

> Map(Paginate(Documents(Collection('board'))),Lambda('x', Get(Var('x'))))
{ data: [] }

为了测试它们是否具有相同的值,我在仪表板上的 shell 上运行此命令

Select(["data", "owner"], Get(Ref(Collection("board"), "278575744915866117")))

Ref(Collection("user"), "278571699875611143")

>> Time elapsed: 28ms

并在我的令牌认证实例上运行 Identity()

> Identity()
Ref(Collection("user"), "278571699875611143")
>                                 

PS 在此方法之前,我仅使用 Select(['data', 'ownerId'], Ref) 匹配 id 号,但它不起作用,即使我尝试同时转换 ToString 或 ToNumber

4

1 回答 1

0

哇,我花了大约 2 天的时间来诊断发生了什么

基本上,我上面写的代码只允许板或任务的所有者查看他/她自己的项目,并更新它们

但是,对我来说问题在于会员资格,它没有按预期工作

如果您发现自己具有非工作权限,则需要遵循以下解决方案步骤

确保该角色适用于您的用户 这是我的做法

  1. 使用默认代码创建示例函数“test_newFunc”Query(Lambda("x", Add(Var("x"), Var("x"))))
  2. 创建一个新角色,并包含所有“用户”,并允许调用“test_newFunc”
  3. 创建令牌,并使用令牌的秘密启动 shell
  4. Call("test_newFunc", 2)
  5. 对我来说,我将成员谓词添加为

Lambda("docRef", Equals(true, Select(["data", "isEnabled"], Get(Var("docRef")))))

这意味着,用户必须有一个数据字段“isEnabled”,其值必须为 true

然后通过为模拟用户切换此字段的值进行测试,直到您确认正在应用此角色

明确此步骤后,您可以测试每个权限的谓词

希望这对遇到此问题的未来开发人员有所帮助

于 2020-10-06T21:27:39.337 回答