Firestore 安全规则 get() 不起作用
Firestore security rule get() not work
解决方案在post的最后。看看吧。
Решение проблемы в конце поста。 Дочитайте.
只是一个简单的问题:这有什么问题以及为什么它不起作用?
尝试通过在用户部分具有 'admin' 角色的用户访问 /titles/{anyTitle} 但仍然获得
Missing or insufficient permissions.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow write: if false;
allow read: if false;
}
function userCanWrite () {
return get(/databases/{database}/documents/users/$(request.auth.uid)).data.role == "admin";
}
match /titles/{anyTitle=**} {
allow read: if request.auth != null;
allow write: if userCanWrite();
}
}
}
Here is my database structure
P.S.
我尝试了官方文档中的另一个规则
get(/databases/{database}/documents/users/$(request.auth.uid)).data.isAdmin == true;
这也行不通
更新:正确的方法
支持帮助我找到了解决方案
这是你应该做的:
数据库结构:
users -> {{ userid }} -> { role: "admin" }
数据库规则设置:
get(usersPath/$(request.auth.uid)).role == "admin" || get(usersPath/$(request.auth.uid)).data.role == "admin";
所以我解决它的方法是我创建了另一个 Collection
称为 admins
然后我刚刚添加了我需要的用户的 uid
-
这是我的数据库结构 - https://i.imgur.com/RFxrKYT.png
这是规则
service cloud.firestore {
match /databases/{database}/documents {
function isAdmin() {
return exists(/databases/$(database)/documents/admins/$(request.auth.uid));
}
match /tasks/{anyTask} {
allow read: if request.auth != null;
allow create: if request.auth != null;
allow update: if request.auth != null && isAdmin();
allow delete: if request.auth != null && isAdmin();
}
}
}
您可以在此处查看我的完整开源项目:
https://github.com/metaburn/doocrate
我联系了 Firebase 支持人员报告该错误,他们为我提供了一个临时解决方案。似乎他们的系统在安全规则方面存在错误。他们说文档没问题,但现在我们应该这样解决:
get(path).data.field == true || get(path).field == true;
因为错误是数据对象没有被填充,所以你应该检查这两个属性。没有针对此错误启动解决方案的 ETA,所以我问他们在解决此问题后是否可以给我建议,因此我会根据他们的信息及时更新此答案。
您应该在代码中使用 $(database)
而不是 {database}
:
get(/databases/{database}/documents/users/$(request.auth.uid)).data.role == "admin";
对我有用的是将 userCanWrite
功能移到我的规则之上。似乎必须在调用它的任何 match
规则之前定义该函数。令人抓狂:-)
这是我用来检查用户是否为管理员的 Firestore 规则。
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read: if true;
allow write: if userIsAdmin();
}
function userIsAdmin() {
return getUserData().userRole == 'Admin';
}
function getUserData() {
return get(/databases/$(database)/documents/User/$(request.auth.uid)).data;
}
}
}
解决方案在post的最后。看看吧。
Решение проблемы в конце поста。 Дочитайте.
只是一个简单的问题:这有什么问题以及为什么它不起作用?
尝试通过在用户部分具有 'admin' 角色的用户访问 /titles/{anyTitle} 但仍然获得
Missing or insufficient permissions.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow write: if false;
allow read: if false;
}
function userCanWrite () {
return get(/databases/{database}/documents/users/$(request.auth.uid)).data.role == "admin";
}
match /titles/{anyTitle=**} {
allow read: if request.auth != null;
allow write: if userCanWrite();
}
}
}
Here is my database structure
P.S.
我尝试了官方文档中的另一个规则
get(/databases/{database}/documents/users/$(request.auth.uid)).data.isAdmin == true;
这也行不通
更新:正确的方法
支持帮助我找到了解决方案 这是你应该做的:
数据库结构:
users -> {{ userid }} -> { role: "admin" }
数据库规则设置:
get(usersPath/$(request.auth.uid)).role == "admin" || get(usersPath/$(request.auth.uid)).data.role == "admin";
所以我解决它的方法是我创建了另一个 Collection
称为 admins
然后我刚刚添加了我需要的用户的 uid
-
这是我的数据库结构 - https://i.imgur.com/RFxrKYT.png
这是规则
service cloud.firestore {
match /databases/{database}/documents {
function isAdmin() {
return exists(/databases/$(database)/documents/admins/$(request.auth.uid));
}
match /tasks/{anyTask} {
allow read: if request.auth != null;
allow create: if request.auth != null;
allow update: if request.auth != null && isAdmin();
allow delete: if request.auth != null && isAdmin();
}
}
}
您可以在此处查看我的完整开源项目: https://github.com/metaburn/doocrate
我联系了 Firebase 支持人员报告该错误,他们为我提供了一个临时解决方案。似乎他们的系统在安全规则方面存在错误。他们说文档没问题,但现在我们应该这样解决:
get(path).data.field == true || get(path).field == true;
因为错误是数据对象没有被填充,所以你应该检查这两个属性。没有针对此错误启动解决方案的 ETA,所以我问他们在解决此问题后是否可以给我建议,因此我会根据他们的信息及时更新此答案。
您应该在代码中使用 $(database)
而不是 {database}
:
get(/databases/{database}/documents/users/$(request.auth.uid)).data.role == "admin";
对我有用的是将 userCanWrite
功能移到我的规则之上。似乎必须在调用它的任何 match
规则之前定义该函数。令人抓狂:-)
这是我用来检查用户是否为管理员的 Firestore 规则。
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read: if true;
allow write: if userIsAdmin();
}
function userIsAdmin() {
return getUserData().userRole == 'Admin';
}
function getUserData() {
return get(/databases/$(database)/documents/User/$(request.auth.uid)).data;
}
}
}