Я использую базу данных, которая хранит данные по следующей схеме:
root:
currentTime
users:
<some user id>:
<value1>
<value2>
<some other id>:
<value1>
<value2>
Я хочу, чтобы каждый пользователь мог редактировать только значения в соответствующей папке user_id.
Мои правила настроены следующим образом:
{
"rules": {
"currentTime": {
".read" : "auth != null",
".write" : "auth != null",
".validate" : "newData.isNumber() && newData.val() > 0"
},
"users": {
"$u_id": {
".read": "auth != null && $u_id === auth.uid",
".write": "auth != null && $u_id === auth.uid"
}
}
}
}
Любой запрос пользователя на чтение или запись получает отказ в разрешении, но если я уберу условие «$ u_id === auth.uid», все это будет работать. Пользователь записывает значения в свою папку user_id, которую я проверил вручную, и это то же самое, что и uid на вкладке пользователей firebase, поэтому я не понимаю, почему оно не выполнит условие.
Если это поможет, это код, который я использую для подключения к базе данных:
LD.LogMessage("Connecting to database");
authCode = PlayGamesPlatform.Instance.GetServerAuthCode();
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
Firebase.Auth.Credential credential =
Firebase.Auth.PlayGamesAuthProvider.GetCredential(authCode);
auth.SignInWithCredentialAsync(credential).ContinueWith(task => {
if (task.IsCanceled) {
Debug.LogError("SignInWithCredentialAsync was canceled.");
return;
}
if (task.IsFaulted) {
Debug.LogError("SignInWithCredentialAsync encountered an error: " + task.Exception);
return;
}
Firebase.Auth.FirebaseUser newUser = task.Result;
Debug.LogFormat("User signed in successfully: {0} ({1})",
newUser.DisplayName, newUser.UserId);
reference = FirebaseDatabase.DefaultInstance.RootReference;
userId = newUser.UserId;
LD.LogMessage("Successfully connected");
LD.canLoad = true;
});