Мое правило хранилища Firebase теперь установлено следующим образом:
rules_version = '2';
// Craft rules based on data in your Firestore database
// allow write: if firestore.get(
// /databases/(default)/documents/users/$(request.auth.uid)).data.isAdmin;
service firebase.storage {
match /b/{bucket}/o {
match /user/{userId}/{allPaths=**} {
allow read,write: if request.auth.uid == userId;
}
}
}
И мой код Python для загрузки изображения:
self.storage.child(self.uid + '/'+fNameonServer+'.png').put(self.path_here + '/dummy.png')
И вот сообщение об ошибке, которое я вижу.
File "C:\Users\bboyc\PycharmProjects\turtle\.venv\turtle_main.py", line 1140, in uploadImage
self.storage.child(self.uid + '/'+fNameonServer+'.png').put(self.path_here + '/dummy.png')
File "C:\Users\bboyc\PycharmProjects\turtle\.venv\lib\site-packages\pyrebaselite\pyrebaselite.py", line 464, in put
raise_detailed_error(request_object)
File "C:\Users\bboyc\PycharmProjects\turtle\.venv\lib\site-packages\pyrebaselite\pyrebaselite.py", line 511, in raise_detailed_error
raise HTTPError(e, request_object.text)
requests.exceptions.HTTPError: [Errno 403 Client Error: Forbidden for url: https://firebasestorage.googleapis.com/v0/b/jost-19f5e.appspot.com/o?name=lKIp1f9k05RmwP6CRWo6qT2Bcir1/imgJustice.png] {
"error": {
"code": 403,
"message": "Permission denied."
}
}
Я думаю, что это должна быть ошибка правила хранения, поскольку этот код работал, когда правило хранения касалось только даты, но он не работает, даже если правило не регулируется. Проблема в том, что я не могу понять, что не так с этим правилом. Я хочу сделать хранилище доступным только в том случае, если пользователь вошел в систему.
Ваши правила безопасности сопоставляют пути объектов по следующему шаблону:
/user/{userId}/{allPaths=**}
Но ваш код вообще не использует /user
в префиксе, поэтому правило не разрешает запись.
Вам следует изменить свой код, чтобы он соответствовал правилу, или изменить правило, чтобы оно соответствовало вашему коду. Если вы изменили свой код, он может выглядеть так:
self.storage.child('/user/' + self.uid + '/'+fNameonServer+'.png')
Почему бы тебе сначала не попробовать воспользоваться моим предложением? Я не думаю, что всегда сопоставлять первый компонент пути с переменным идентификатором пользователя — хорошая идея. Это не поможет вам организовать непользовательский контент в будущем.
Я понял, что создаю только папку {userId} в Storage, поэтому дерево выглядит как Storage/userId/Filename.png . Поэтому, следуя вашему предложению, я подумал, что изменение правила более адекватно. На самом деле правило, которое я сейчас использую для теста, — match /{userId}/{allPaths=**} { allow read,write; }
, и загрузка выполняется очень хорошо. Но я до сих пор не могу понять, почему разрешение по uid не работает.
Но я глубоко понимаю, что ваше предложение правильное. Я попробую ваше предложение на 100% как можно скорее и оставлю еще один комментарий. Большое спасибо.
Я просто последовал вашему предложению, изменил правила и свой код, но не смог сделать это правильно. Можете ли вы подсказать мне, чего мне не хватает?
Я немного изменил правило на ``` match /{userId}/{allPaths=**} {allow read,write: if request.auth != null; } ``` и удалось загрузить, хотя в моем правиле нет
if request.auth != null
. Однако мне по-прежнему выдается ошибка 403, когда я хочу разрешить загрузку только при загрузке.