当前位置: 首页 > 知识库问答 >
问题:

Firebase实时数据库-多组访问?

何雅惠
2023-03-14

我目前有一个类似以下的数据库结构。如果无法在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/authorizedGroups中指定的任何组与当前用户的组之间的匹配来限制它?


共有1个答案

索令
2023-03-14

首先,用户组可能会产生误导。它可能意味着“每个用户的组”。如果没有任何其他类型的组,可以将其称为

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

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 ID查询和以下所有查询的同步,您可以用数据的完整副本替换true,为其他应该更改该数据的数据库更改添加触发器,并拥有客户端只查询userFunData/$uid,其中应该包含他们应该看到的所有数据。

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

 类似资料:
  • 我有一个应用程序,存储256行数字,指示网格视图中每个256个单元格的背景颜色。目前所有的值都是-16449536,表示简单的黑色。 以下是我在Firebase数据库中的JSON结构 在onCreative方法中,我使用for循环为每个单元格读取256次: 并非所有网格都是黑色的。每次我重新打开应用程序以触发onCreate方法时,网格模式都会有所不同。我是否达到了firebase实时数据库的某些

  • 我有以下Firebase实时数据库连接到我的Flatter项目: 我对flutter和fire base相当陌生,我知道在我的flutter项目中访问此数据库中数据的一种方法是使用数据库引用变量。所以我有以下参考变量: 现在,如何使用此itemRef访问数据库中的温度和脉冲值?

  • 我在一个Android应用程序中使用Firebase数据库,每次用户启动时,我都会在数据库中存储一些值,为此我会执行以下操作: 正如您在子方法中看到的,如果称为“usrId”,它将创建usrId目录,并在其中添加所有neccesary信息。但是我想为每个用户创建目录,所以我尝试传递usrId变量作为参数。但它不起作用。当我调试代码时,调试器说本地var usrId无法识别,我的问题是如何在Fire

  • 我在Firebase项目中使用多个数据库。主(默认)数据库的云函数工作得很好,但是,我不能让它们用于辅助数据库。例如,我想在具有管理员权限的节点上发出读取请求: 这在主数据库中有效,但是,如果我想在另一个数据库上执行该命令,则不起作用: 虽然已经部署了这些功能,但是当我试图执行云功能时,控制台上出现了一个错误。 以下是带有https触发器的云函数的代码: 下面是Firebase控制台中的错误日志:

  • 我需要一个简单的方法来阻止任何人将下面的代码复制到他们的inspector工具中,从而添加错误的分数。没有用户,我只想限制浏览器的写入权限。Firebase实时数据库中的安全规则有没有办法做到这一点?现在我只有“.read”:true“.write”:true和验证。