我想定义一条规则,允许用户只更新自己的项目,管理员更新所有项目。
作为uid_of_logged_in_administrator
,我应该能够同时更新items/item__1
和items/item__2
- 这是有效的。
作为uid_of_logged_in_user
我应该被允许更新items/item__1
而不是items/item__2
- 但事实并非如此。
显然问题是我不知道数据类型[ Cloud Firestore引用]在规则中的含义。
我已阅读有关规则的文档并尝试了不同的事情。
if request.auth.uid == resource.data.owner | false
if request.auth.uid == resource.data.owner.id | false
if request.auth.uid == resource.data.owner.__id__ | false
if resource.data.owner is string | false
if resource.data.owner is path | true
if resource.data.owner == path('users/uid_of_logged_in_user') | false
if request.auth.uid == resource.data.owner[6] | false
所以似乎resource.data.owner是一个路径。
但是如何获取此引用的ID?
创建此引用的一个原因是owner属性可以是框或用户。例如。 {owner: '/users/uid_of_logged_in_user'}
,{owner: '/boxes/box__1'}
我当然可以添加一个属性,将用户uid作为字符串添加到项目而不是作为参考。但是我需要为box或user作为所有者拥有两个不同的属性。
service cloud.firestore {
match /databases/{database}/documents {
function isAdmin() {
return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "admin";
}
function isAuth() {
return request.auth.uid != null;
}
match /users/{uid} {
allow read: if isAuth();
allow write: if isAdmin();
}
match /items/{umbId} {
allow read: if isAuth();
// THIS IS THE ISSUE. IT DOESENT WORK.
allow update: if request.auth.uid == resource.data.owner
allow write: if isAdmin();
}
}
}
users
# documentid(uid_of_logged_in_user)
- name: 'My name' // string
- address: 'My address' // string
# documentid(uid_of_logged_in_administrator)
- name: 'Another one' // string
- address: 'His address' // string
- role: 'admin'
items
# documentid(item__1)
- owner: 'users/uid_of_logged_in_user' // reference
- name: 'The first item' // string
# documentid(item__2)
- owner: 'users/uid_of_logged_in_administrator' // reference
- name: 'The first item' // string
boxes
# documentid(box__1)
- name: 'First Box' // string
documentid(box__2)
- name: 'Second box' // string
答案 0 :(得分:2)
ERROR: test_parse_extended (tests.test_confparser.ConfigFileParserTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/florian/metwork/mfdata/src/acquisition/tests/test_confparser.py", line 39, in test_parse_extended
config_parser.read_string(content)
File "/opt/metwork-mfext/opt/python2/lib/python2.7/site-packages/backports/configparser/__init__.py", line 728, in read_string
sfile = io.StringIO(string)
TypeError: initial_value must be unicode or None, not str
应该有用。