我真的希望能够通过仅允许firebase函数写入特定集合来保护我的firestore db ......我将如何去做?看那里的文档我找不到任何可能说明你怎么做的东西.例如,我正在寻找类似的东西:
service cloud.firestore {
match /databases/{database}/documents {
// Match any document in the 'cities' collection
match /cities/{city} {
allow read;
allow write: if <from firebase function>;
}
}
}
Run Code Online (Sandbox Code Playgroud) firebase google-cloud-functions google-cloud-firestore firebase-security-rules
我的团队最近讨论过这个问题,似乎无法确定实际/预期的行为:
如果您有以下安全规则:
match /categories/{document=**} {
allow update: if request.auth.uid != null
&& request.resource.data.firstName is string
&& request.resource.data.lastName is string;
}
Run Code Online (Sandbox Code Playgroud)
然后使用以下数据从前端到/ categories /创建更新语句:
{
firstName: 'A valid firstName'
}
Run Code Online (Sandbox Code Playgroud)
那么安全规则应该通过还是失败?
在参考文档中,它说
开发人员提供的数据显示在request.resource.data中,这是一个包含字段和值的映射.资源中存在的请求中未提供的字段将添加到request.resource.data
相关问题:
{age: 28}
问题3有更多细节(架构问题) 假设你有这样的模型:
interface Category {
firstName: string;
lastName: string;
age?: int;
groupId?: string;
}
Run Code Online (Sandbox Code Playgroud)
现在我们创建一个像这样的安全规则:
match /categories/{document=**} {
allow update: if request.auth.uid != null
&& request.resource.data.firstName is string
&& request.resource.data.lastName is string;
&& request.resource.data.age is int;
&& request.resource.data.groupId is string; …
Run Code Online (Sandbox Code Playgroud) 对于Firebase实时数据库的安全规则,公共和私有数据都可以使用如下规则存在于同一树中.
但是,在使用Firestore时,它似乎无法让我们这样做,因为我们可以检索的数据只是在集合或文档下.当公共和私人数据在同一文档中定义并获取带有收集/文档的数据时,如果我们不是所有者,我们会收到私有数据权限不足的错误.
使用RTDB时,我们可以获取'users/{userId}/publicInfo'的数据,因为我们对收集/文档一无所知.
有什么方法可以使用Firestore来实现RTDB吗?否则,我们应该分开公共/私人收藏?
// rule of Firebase Realtime Database
"users": {
"$user_id": {
".read": "auth.uid === $user_id",
".write": "auth.uid === $user_id",
"private": {
".read": "auth.uid === $user_id" // --- private data
}
"public": {
".read": "auth !== null"; // --- public data
}
}
}
// Firestore
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
match /{private=**} {
allow read, write: if request.auth == userId;
}
match /{public=**} {
allow read, write: if request.auth != null;
}
} …
Run Code Online (Sandbox Code Playgroud) 在firestore中,如果用户teamid
在文档中提到的那样,我希望用户只访问文档.现在我有一个不同的集合teams
,我将用户映射为{ user_id = true }
.所以我在Firestore规则中有以下内容
return get(/databases/$(database)/documents/teams/$(resource.data.teamid)).data.approvedMembers[request.auth.uid] == true;
Run Code Online (Sandbox Code Playgroud)
现在,此规则不起作用,并且未能通过前端向数据库发出任何请求.但当我$(resource.data.teamid)
用我的实际teamid
值替换如下,
return get(/databases/$(database)/documents/teams/234234jk2jk34j23).data.approvedMembers[request.auth.uid] == true;
Run Code Online (Sandbox Code Playgroud)
......它按预期工作.
现在我的问题是我resource
是以错误的方式使用resource
,get()
还是exists()
在Firestore规则中不支持或查询?
编辑 完整规则如下
service cloud.firestore {
match /databases/{database}/documents {
function isTeamMember() {
return get(/databases/$(database)/documents/teams/$(resource.data.teamid)).data.approvedMembers[request.auth.uid] == true;
// return exists(/databases/$(database)/documents/teams/$(resource.data.teamid));
}
match /{document=**} {
allow read, write: if isTeamMember();
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您注意到注释掉的规则,exists()
则在这种情况下也不起作用.
我正在Firestore中努力为文档设置安全规则。使用RTDB可以为特定对象属性设置规则,而我正尝试使用Firestore进行设置。
RTDB代码:
"users": {
".read": true,
".indexOn": ["profile/name"],
"$uid": {
".read": "auth != null",
".write":
"$uid === auth.uid && !data.exists()",
"profile": {
"birthday": {
".write": "$uid === auth.uid"
},
"name": {
".write": "$uid === auth.uid"
},
"banned": {
".write": "root.child('admins').child(auth.uid).exists()"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在Firestore中的相同代码下方:
service cloud.firestore {
match /databases/{database}/documents {
match /users/ {
allow read
match /{$user} {
allow read: if request.auth.uid != null
allow write: if request.auth.uid == request.resource.id && exists(/databases/$(database)/documents/users/$(request.resource.id)) === false
match /birthday {
allow write: …
Run Code Online (Sandbox Code Playgroud) 我正在使用Firebase Cloud Firestore,我想修改我的规则以限制用户查询集合.
这不应该被允许:
firestore().collection("users").get()
Run Code Online (Sandbox Code Playgroud)
但是应该允许这样做:
firestore().collection("users").doc("someUserId").get()
Run Code Online (Sandbox Code Playgroud)
目前,我的规则如下:
match /users/{userId} {
allow read;
}
Run Code Online (Sandbox Code Playgroud)
但是此规则允许查询"用户"集合.
如何允许单个文档获取,但不允许收集查询?
javascript firebase google-cloud-firestore firebase-security-rules
我最近收到来自firebase的电子邮件,告诉我我的实时数据库有不安全的规则.这些是我设定的规则:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
Run Code Online (Sandbox Code Playgroud)
这不是一个安全的规则吗?
电子邮件/密码是我启用的唯一登录方式.
firebase firebase-authentication firebase-realtime-database firebase-security-rules
我有一个使用Firebase SDK直接从应用程序内部与Cloud Firestore对话的应用程序。我的代码确保仅以合理的间隔写入数据。但是恶意用户可能会从我的应用程序中获取配置数据,并使用它将无尽的数据流写入我的数据库。
我如何确保用户每隔几秒钟只能写一次发言,而不必编写任何服务器端代码。
我正在尝试将Firebase的Rule通配符与子项比较混合使用.
我正在读一个价值为'4'的孩子.
当我进行文字比较时,模拟器会给我绿灯(如下所示):
{
"rules": {
"die": {
"rolls": {
"$i": {
".read": "4 == root.child('die/i').val()"
}
},
"i": {
".read": true,
".write": true
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出(成功):
Type read
Location /die/rolls/4
Data null
Auth null
Read successful
Line 7 (/die/rolls/4)
read: "4 == root.child('die/i').val()"
Run Code Online (Sandbox Code Playgroud)
但是通配符比较失败了.为什么?
{
"rules": {
"die": {
"rolls": {
"$i": {
".read": "$i == root.child('die/i').val()"
}
},
"i": {
".read": true,
".write": true
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出(失败):
Type read
Location /die/rolls/4
Data null
Auth …
Run Code Online (Sandbox Code Playgroud) real-time wildcard firebase firebase-realtime-database firebase-security-rules
如何使用"允许更新但不允许添加新记录"来设置数据库规则?
我尝试在下面模拟,但不起作用..
我的数据:
{
users:{
-randomID001:{
email:user@email.com,
status:active
},
-randomID002:{
email:user2@email.com,
status:inactive
}
}
}
Run Code Online (Sandbox Code Playgroud)
在控制台中模拟:
{
"rules": {
".read": "auth != null",
"users":{
".indexOn": "email",
".write":"!newData.exists() && data.exists()"
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果新记录不存在且现有记录存在,这行代码显示允许写入的意思?
".write":"!newData.exists() && data.exists()"
Run Code Online (Sandbox Code Playgroud)
以下是我提交的测试数据:
{
"randomID001":{"status":"inactive"}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Simulated update denied
Run Code Online (Sandbox Code Playgroud)
请指教.