javascript - 从应用程序级别控制 Firebase 存储规则
问题描述
我在 Firestore 中有一个将用户文件存储在云中的应用程序。这是我的问题,我可以通过应用程序设置规则吗?在这一点上,我有这样的事情:
rules_version = '2';
function isAdmin() {
return request.auth !=null && request.auth.uid in [
"Xk60AqYDM4ONw5VOR0v89c8RF9P2",
"3e8kXyjUvUY8WOHp75Z1Y278OO63"
];
}
function companyJP(){
return request.auth !=null && request.auth.uid in [
"CUTSs8oziESYDzPqyv2ac7XOKMD2",
"gqTFDiP7lYeaCaYFd9SG52LCMYF3"
];
}
service firebase.storage {
match /b/{bucket}/o {
match /users/{userID}/{allPaths=**} {
allow read, write: if request.auth.uid == userID;
}
match /files/{groupId}/{allPaths=**} {
allow read: if resource.metadata.owner == request.auth.token.groupId;
allow write: if request.auth.token.groupId == groupId;
}
match /files/adminFiles/{allPaths=**} {
allow read, write: if isAdmin();
}
match /files/companyJP/{allPaths=**} {
allow read, write: if firmaJP();
}
}
}
我想通过 Web 应用程序设置这些规则。有什么命令吗?有谁能帮助我吗?
解决方案
您无法从前端应用程序更改安全规则的代码。
您可以在Firestore安全规则中做的是将规则的一些条件语句(例如allow read
)基于某些 Firestore 文档的存在或文档字段中包含的值。为此,您将使用get()
andexists()
函数,如文档中所述。因此,您可以从前端修改这些 Firestore 文档的值,以动态修改安全规则语句的结果。
但是,在您的情况下,您正在为Cloud Storage编写规则,并且在 Cloud Storage 安全规则中,无法访问存储在 Firestore 中的数据或文档。
一种解决方案是使用自定义声明。您将能够通过自定义声明实现基于角色的访问控制。具体来说,您可以将companyJP
属性分配给用户的帐户CUTSs8oziESYDzPqyv2ac7XOKMD2
(请阅读文档以获取更准确的详细信息)。
您可以从您的前端应用程序中,允许某些特定(管理员)用户更改其他用户的声明(即角色)。由于自定义声明只能由 Firebase Admin SDK 从特权服务器环境设置,因此最简单的方法是使用您从前端调用的可调用云函数(并在其中检查调用云的用户函数具有管理员权限)。
您可能会对这篇文章感兴趣,该文章解释了如何构建一个模块,该模块允许具有特定管理员角色的 Firebase 最终用户创建其他用户并为他们分配其他特定用户角色。
推荐阅读
- javascript - 调试器检查的代码在 console.log 中显示正确的返回值,那么为什么我返回未定义?
- html - 如何修复不在wordpress中居中的菜单
- matlab - 如何更改 Matlab 代码以便 imshow() 函数显示正确的颜色?
- python - 如何使用 Selenium 更改 Chrome 的音量
- r - 从 2 列文本到 1
- python-3.x - 如何在一组二进制字符串中高效地求和所有无序对的乘积
- g++ - Valgrind 显示 ??? 尽管有 -g 标志,但对于行号
- java - 如何修复此递归代码的执行?
- facebook-graph-api - FB Graph API 页面消息发布问题
- c++ - 如何修复错误标识符“PlayerViewPointLocation”未定义