【问题标题】:Why doesn't security rule work for specific users in Firebase-Unity?为什么安全规则不适用于 Firebase-Unity 中的特定用户?
【发布时间】:2019-10-19 10:39:52
【问题描述】:

我想保护每个用户的数据库,并且只能由其自己的用户访问。 当我尝试通过一些代码统一访问数据库时,它会失败并且访问数据的权限被拒绝。

我的 Firebase 安全规则

...

 "rules": {
"users": {  
  "$user": {
    ".read": "auth.provider === 'facebook'", 
    ".write": "auth !== null && auth.uid === $user"
   }
 }}

...

在 Unity 中,为了写入数据,我在验证用户身份后使用以下代码: ...

playerDbRef.Child("users").Child(UserId).Child("User_Info").Child("name").SetValueAsync(UserName);

根据规则,只有用户 x 可以访问数据 x。但在实践中这是行不通的。 问题可能是什么?提前致谢。

【问题讨论】:

    标签: c# firebase unity3d firebase-realtime-database firebase-security


    【解决方案1】:

    如果我正确理解您的问题,您担心用户能够阅读/users/$user,即使他们的用户 ID 与 $user 中存储的内容不匹配。在这些规则的情况下,您已经做到了,通过 Facebook 进行身份验证的任何人都能够读取存储在/users/$user 下的任何值,并将其锁定,您实际上希望您的“.read”规则与您的“相同” .write”规则。 如果我误解了你的问题,你现在可以停止阅读了。

    验证规则的一种非常简单的方法是使用 Firebase 的实时数据库模拟器,该模拟器内置在我们的 Web 控制台中。我已将您的示例规则嵌入为(更改为您省略的格式和前导 {}):

    {"rules": {
      "users": {  
        "$user": {
          ".read": "auth.provider === 'facebook'", 
          ".write": "auth !== null && auth.uid === $user"
         }
       }
    }}
    

    使用此模拟器,您可以看到,如果我在未经身份验证时尝试读取,我会被阻止: read unauthenticated

    但是当我以任何用户的身份阅读时,它会让我进入: read as any facebook user

    如果我点击详细信息,它会告诉我确切的原因(我的身份验证提供者是 facebook): details of why the rule passed

    另一方面,您会看到我随后无法写入此节点: write rejected as any user 因为您的写入规则应该是正确的,除非我的用户 ID 也匹配: write accepted as owning user

    我希望这会有所帮助!

    【讨论】:

    • 您好,感谢您抽出宝贵时间回复。我发现规则运行良好,问题出在 Unity 本身。实际上,当应用安全规则时,Unity 无法很好地处理 Firebase 身份验证或读/写数据,除非项目是在移动设备上构建的。因此,通过在移动设备上对其进行测试,一切对我来说都运行良好,这意味着统一编辑器似乎无法响应所有 firebase 功能。
    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2019-04-06
    • 1970-01-01
    • 2021-03-31
    • 2018-12-18
    • 2021-01-04
    相关资源
    最近更新 更多