【问题标题】:Firebase Realtime Database - Multi Group Access?Firebase 实时数据库 - 多组访问?
【发布时间】:2021-04-13 17:07:09
【问题描述】:

我目前有一个类似于以下的数据库结构。如果无法在 Firebase 实时数据库安全规则中循环,我如何根据用户访问多个组来保护数据?要遵循的示例...

数据库结构:

// list of different groups a user can belong to.
// they can belong to multiple groups.

"userGroups": {
  "groupA": ...
  "groupB": ...
  "groupC": ...
}

// each user has a list of group ids they belong to

"users": {
  "userA": {
    groups: ['groupA', 'groupB'],
  },
  "userB": {
    groups: ['groupB'],
  }
}

// various nodes in the database an admin sets restriction on content
// so specific data can only be access by specified group

"someFunData": {
  "data1": {
    authorisedGroups: ['groupA', 'groupB'],
  },
  "data2": {
    authorisedGroups: ['groupB'],
  }
}

如何在someFunData 上指定安全规则,以根据someFunData/$dataId/authorisedGroups 中指定的任何组与当前用户的groups 之间的匹配来限制它?

【问题讨论】:

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


    【解决方案1】:

    首先,userGroups 可能会产生误导。它可能意味着“每个用户的组”。如果您没有任何其他类型的群组,您可以直接调用它groups

    在类似的场景中,我为影响用户应该看到的每条路径创建了一个云函数。

    const updateUserFunData = (path: string) => {
        return functions.database.ref(path).onWrite(async (data, context) => {
            // Download any required data, calculate what changes should be made,
            // then use a multi-path update to save these changes, like this:
            await rootRef.child('userFunData').update({
                [uid1 + '/' + data1]: true, // or a complete copy of the data
                [uid1 + '/' + data2]: null, // use null to delete
            });
        });
    };
    export const onUserGroupsChange = updateUserFunData('users/{uid}/groups');
    export const onFunDataGroupsChange = updateUserFunData('someFunData/{dataId}/groups');
    

    然后客户端可以读取userFunData/$uid 以获取他们的数据ID(然后获取每个funData),并且规则可以检查userFunData/$uid/$dataId 是否存在,以允许或拒绝读取。

    如果您想跳过该中间 funData IDs 查询和所有以下查询的同步,您可以将true 替换为数据的完整副本,为应该更改该数据的其他数据库更改添加触发器,并让客户只查询userFunData/$uid,其中应该包含他们应该看到的所有数据。


    您评论说维护每个用户的数据列表是不切实际的。您可以维护每个组的数据列表,并让每个用户获取每个组的数据。规则将检查用户是否存在于正在读取的组的用户中。您必须将每个组的用户(或每个用户的组)保存为地图而不是数组。

    【讨论】:

    • 我认为在我的情况下存储每个用户的可访问数据 ID 列表是不现实的。访问不是固定/预设的,因为它可以由创建者随时更改。这意味着如果任何用户更新了对其数据的任何访问权限,则可能需要数万次写入。
    猜你喜欢
    • 2021-04-22
    • 2019-02-16
    • 1970-01-01
    • 2020-08-13
    • 2021-06-14
    • 2019-04-13
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多