我想保护每个用户的数据库,并且只能由其自己的用户访问。 当我尝试通过一些代码统一访问数据库时,它会失败并且访问数据的权限也会被拒绝。
我的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。但实际上却行不通。 可能是什么问题?预先感谢。
答案 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
我希望这会有所帮助!