为什么安全规则对Firebase-Unity中的特定用户不起作用?

时间:2019-06-03 21:26:56

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

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

我的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。但实际上却行不通。 可能是什么问题?预先感谢。

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,那么您担心的是,即使用户ID与$ user中存储的用户名不匹配,用户也仍然可以读取/users/$user。对于这些规则,您已经做到这一点,以便通过Facebook进行身份验证的任何人都可以读取/users/$user下存储的任何值,并将其锁定,您实际上希望您的“ .read”规则与您的“ .write”规则。 如果我对您的问题有误解,您可以立即停止阅读。

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

{"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

我希望这会有所帮助!