Tro*_*nda 5 firebase firebase-security google-cloud-firestore
我想定义一个规则,该规则只允许用户更新自己的项目,而管理员仅更新所有项目。
因为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
Run Code Online (Sandbox Code Playgroud)
因此,似乎resource.data.owner是路径。
但是,如何获取此参考的ID?
我创建此引用的原因之一是owner属性可以是一个框或一个用户。例如。{owner: '/users/uid_of_logged_in_user'},{owner: '/boxes/box__1'}
我当然可以只添加带有用户uid的属性作为项目的字符串,而不是作为引用。但是然后我需要为框或用户作为所有者拥有两个不同的属性。
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
if resource.data.owner == /databases/$(database)/documents/users/$(uid_of_logged_in_user)应该管用。
| 归档时间: |
|
| 查看次数: |
1383 次 |
| 最近记录: |