邀请用户共享Firebase对象

时间:2016-08-30 08:07:17

标签: firebase firebase-realtime-database firebase-authentication firebase-security

我有一个带有清单的应用,我希望能够与其他用户共享清单。这些用户可能尚未在我的应用中注册。目前我的数据库结构如下:

{
    "checklists" : {
        "-KQKfnuGEhhoSIXyFj71" : {
            "admins" : [
                { "C9fdXO6jWTZIxzgbhy0K10TEBqx1" : true },
                {"ZQKHTbTlVMQwnZzFkQUcJF84SaA3" : true }
            ],
            "users" : {
                "-KQKfnuGEhhoSIXyFj74" : {
                    "email" : "admin1@example.com",
                    "uid" : "C9fdXO6jWTZIxzgbhy0K10TEBqx1",
                    "active" : true,
                    "name" : "Moses"
                },
                "-KQKfnuGEhhoSIXyFj75" : {
                    "email" : "admin2@example.com",
                    "uid" : "ZQKHTbTlVMQwnZzFkQUcJF84SaA3",
                    "active" : true,
                    "name" : "John"
                },
                "-KQKfnuGEhhoSIXyFj76" : {
                    "email" : "user1@example.com",
                    "uid" : "1ZxxYFGzoCPIc7Am07GVRxSN7xT2",
                    "active" : true,
                    "name" : "Kate"
                },
                "-KQKfnuGEhhoSIXyFj77" : {
                    "email" : "user2@example.com",
                    "active" : false
                }
            },
            "data" : {
                "task1" : "hello",
                "task2" : "good bye"
            }
        }
    }
}

我的螺栓文件如下:

// admin can do both read/ write to the while checklist
path /checklists/{checklistId} {
  read() { isChecklistAdmin(checklistId) }
  write() { isChecklistAdmin(checklistId)  }
}

// users of checklist can do read/write on data only
path /checklists/{checklistId}/data {
  read() { isChecklistUser(checklistId) }
  write() { isChecklistUser(checklistId)  }
}

// users of checklist can add/ remove themselves from the list by updating active flag
path /checklists/{checklistId}/users/{checklistUserId} {
    // all checklist users can read other users
    read() { isChecklistUser(checklistId) } 

    // only admin (implicit) or the user can accept/reject (active) invitation or update their details
    write() { isChecklistUser(checklistId) && ref.parent().email == auth.email } 
}

// is authenticated user in the list of checklist admins?
isChecklistAdmin(checklistId) { isSignedIn() &&  root.checklists[checklistId].admins[auth.uid] != null }

// is authenticated user in the list of checklist users (test email ==)
isChecklistUser(checklistId) { isSignedIn() && root.checklists[checklistId].users['*'].email == auth.email }

isSignedIn() { auth != null }

我想到的流程是:

  1. 管理员在用户下添加一个节点,该节点包含受邀用户的电子邮件
  2. 管理员发送电子邮件邀请(我本来希望使用Firebase邀请,但我不知道如何在这种情况下集成它 - 会喜欢建议)。
  3. 用户注册/登录并将活动标志更新为真
  4. 我的问题:如果你看一下isChecklistUser函数,你会发现我正在使用"通配符" (" *")因为我不知道那是什么价值。管理员无法在邀请时设置,因为用户可能尚未注册。

0 个答案:

没有答案