首页 > 解决方案 > 带有自定义声明的简单访问控制 Firebase 实时数据库不起作用

问题描述

firebase 项目的所有用户都使用电话提供商进行身份验证。

我正在为所有使用 C# 的用户设置自定义声明,如下所示 -

var claims = new Dictionary<string, object>()
{
    { "admin", true },
};
var pagedEnumerable = FirebaseAuth.DefaultInstance.ListUsersAsync(null);
var responses = pagedEnumerable.AsRawResponses().GetAsyncEnumerator();
while (responses.MoveNextAsync().Result)
{
    ExportedUserRecords response = responses.Current;
    foreach (ExportedUserRecord user in response.Users)
    {
        FirebaseAuth.DefaultInstance.SetCustomUserClaimsAsync(user.Uid, claims);
    }
}

在 firebase 实时数据库中,我有以下节点 -

    {
      "Configuration" : {
        "Sync" : "XYZ"
      },
      "adminContent" : {
        "key" : "val1"
      }
    }

我正在尝试使用自定义声明配置数据库访问规则 -

    {
      "rules": {
    
        "adminContent": {
          ".read": "auth.token.admin === true",
          ".write": "auth.token.admin === true"
        }
    
      }
    }

我正在尝试使用规则游乐场来验证对 adminContent 节点的读取访问权限并收到错误为 -

使用 Rule Playground 验证读取访问时出错

结果弹出显示为 -

请求 - 类型读取 Location /adminContent Data null Auth { "provider": "anonymous", "uid": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } Admin false

响应 - READ Denied 第 5 行 (/adminContent) 读取:“auth.token.admin === true”

使用 C# 代码,我已验证用户上存在管理员自定义声明。

有人会帮助解决这个错误吗?

标签: firebasefirebase-realtime-databasefirebase-securityfirebase-admin

解决方案


Firebase 控制台中的规则游乐场不会读取现有用户的任何个人资料信息。如果您想测试在用户拥有admin声明时是否允许读取,您需要通过选择Custom提供程序在规则游乐场中指定该声明,然后编辑Auth token payload以包含它。

另请参阅:Firestore 在线规则模拟器失败并出现自定义声明,我刚刚发现它实际上会将您的问题作为重复项关闭。


推荐阅读