FaunaDB自定义角色将访问权限限制为仅对自己的数据的访问

问题描述

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

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

我相信我正在朝着正确的方向运行此模型,但是我在FaunaDB中遇到了自定义角色的问题

数据模型为用户->董事会->任务,在这个问题中,我将使用对董事会的访问权限

这是自定义角色的代码

{
  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(),"owner"],Get(Var("ref"))))
          )
        ),write: Query(
          Lambda(
            ["oldData","newData"],And(
              Equals(
                Select("id",Identity()),Var("oldData"))
              ),Equals(
                Select(["data",Var("oldData")),Var("newData"))
              )
            )
          )
        ),create: Query(
          Lambda(
            "newData",And(
              Equals(Identity(),Var("newData"))),LT(Count(Match(Index("board_by_owner"),Identity())),3)
            )
          )
        ),delete: Query(
          Lambda(
            "ref",{
      resource: Collection("task"),LT(Count(Match(Index("task_by_owner"),10)
            )
          )
        ),{
      resource: Index("task_by_owner"),actions: {
        unrestricted_read: false,read: false
      }
    },{
      resource: Index("board_by_owner"),read: false
      }
    }
  ]
}

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

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

要测试它们是否具有相同的值,我正在仪表板上的外壳上运行此命令

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

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

>> Time elapsed: 28ms

并在经过令牌验证的实例上运行Identity()

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

P.S。在使用这种方法之前,我仅使用Select(['data','ownerId'],Ref)来匹配ID号,但是即使我尝试同时转换ToString或ToNumber都没有用

解决方法

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

基本上,我上面编写的代码仅允许董事会或任务的所有者查看其自己的物品并进行更新

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

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

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

  1. 使用默认代码Query(Lambda("x",Add(Var("x"),Var("x"))))创建示例函数'test_newFunc'
  2. 创建一个新角色,并包括所有“用户”,并允许调用“ test_newFunc”
  3. 创建令牌,然后使用令牌的秘密启动外壳程序
  4. 运行Call("test_newFunc",2)
  5. 对我来说,我添加了成员​​谓词

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

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

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

清除此步骤后,即可测试每种权限的谓词

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