我有一个使用Firestore和Cloud Functions的客户端Web应用程序.
我想设置规则,使得如果用户具有用户能够写入的文档的秘密URL,则无需任何其他类型的登录或身份验证.像(伪代码,我刚刚编写request.params.secret_token):
service cloud.firestore {
match /databases/{database}/documents {
match /cities/{city} {
allow read, write: if resource.data.secret_token == request.params.secret_token;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我对各种可用的身份验证选项感到困惑,并且无法通过最好的方式推理.
感觉接近的潜在选择:
我想让用户有权更新文档.但仅限用户更新此文档的一个特定字段.此用户不应更改所有其他字段.
这可能在火店吗?
我试过这样的事情:
function isUpdateToOpenField(attr) {
return attr == get(/databases/$(database)/documents/stores/$(store)).data.open;
}
allow update: if isUpdateToOpenField(request.resource.data);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何比较更新是否对应于正确的字段.
firebase-security google-cloud-firestore firebase-security-rules
我想通过客户端发送Firestore文档的创建时间,并使用Firestore规则验证时间,以避免云函数调用(定价).
我正在测试客户端对Firestore规则的请求,如下所示:
allow create: if request.resource.data.TIMEFIELD == request.time;
Run Code Online (Sandbox Code Playgroud)
该请求包含一个TIMEFIELD具有时间戳的请求,就像request.time.
显然,请求时间和我在发送请求之前设置为字段的时间不相等,这使得这种比较变得不可能.
以下是request.time文档中的定义.
我想知道是否有办法在文档中设置一个等于的字段request.time.
由于Flutter存在问题,我无法使用服务器端时间戳.
因此,我需要知道如何验证客户端时间戳,例如time.nowFirestore规则.
这是我的错误: 运行模拟错误—错误:Simulator.rules第[10]行,第[13]列。找不到函数错误:名称:[get]。错误:提供了无效的参数来调用。函数:[get],参数:[“ || invalid_argument ||”]
当我运行此程序时,我已经用尽了我在网络上可以找到的所有资源,却找不到任何可以使用的资源(当我只使用isSignedIn()时,允许读取的工作和创建的工作)...一点帮助。
service cloud.firestore {
match /databases/{database}/documents{
match /users/{documents} {
function isSignedIn() {
return request.auth != null;
}
function getRole(admin){
return get(/databases/$(database)/documents/users.[request.auth.uid]).data.admin;
}
allow read: if true;
allow write: if getRole(admin) == true;
}
}
}Run Code Online (Sandbox Code Playgroud)
我在Firebase托管上托管了一个静态应用,其后端也在Firebase上(使用firebase JS api进行通信)。我想向该网站的所有页面添加一个简单的身份验证页面,以便只有我想要的用户才能访问该网站。这可能吗?
查看了文档,但没有找到任何可以帮助我的方面。
firebase firebase-hosting firebase-authentication firebase-realtime-database firebase-security-rules
我有以下结构:
events
-LEe7X118dkcH2JhJRe
description: "Testdescr"
eventTasks
participants
0zlwpSlCazNGjOyMi95h8awshrG2
lastLogin: 1528641494535
userKey: "0zlwpSlCazNGjOyMi95h8awshrG2"
username: "User1"
6LnYKxRu2SWUrxwIzId8dDpOrl02
lastLogin: 152856590172
userKey: "6LnYKxRu2SWUrxwIzId8dDpOrl02"
username: "User2"
Run Code Online (Sandbox Code Playgroud)
我想查询用户参与者(如过滤器)的所有事件.我的Java代码是:
mDatabaseReference = FirebaseDatabase.getInstance().getReference("event");
mDatabaseReference.orderByChild("participants/"+userId+"/userKey").equalTo(userId).addChildEventListener [...]
Run Code Online (Sandbox Code Playgroud)
这就像一个魅力 - 我只收到正确的事件.
现在,我想在服务器端创建基于查询的规则(https://firebase.google.com/docs/database/security/securing-data).所以我创建了一个读取规则,如:
".read": "query.orderByChild == 'participants/'+auth.uid+'/userKey' && query.equalTo == auth.uid"
Run Code Online (Sandbox Code Playgroud)
问题:我无法保存该规则.Firebase给出了错误:"无效==表达式:与排序进行比较时,右操作数必须是排序或字符串文字." 为什么不能将"query.orderByChild"与auth.uid结合使用?
我究竟做错了什么?
编辑:这是我的完整规则:
{
"rules": {
".write": true,
"event":{
".read": "query.orderByChild == 'participants/'+auth.uid+'/userKey' && query.equalTo == auth.uid"
}
}
}
Run Code Online (Sandbox Code Playgroud) database-design firebase firebase-realtime-database firebase-security-rules
我需要让匿名用户能够更新嵌套体系结构中的特定值,而无需对文档的其余部分授予权限.
events 是一个顶级集合,我更新我的文档是这样的
update(`events/${event.id}`, {
[`boardgames.${boardgameId}.votes.${uid}`]: true,
})
Run Code Online (Sandbox Code Playgroud)
我试过这个解决方案
allow update: if ((request.writeFields.size() == 1) && ('boardgames' in request.writeFields));
Run Code Online (Sandbox Code Playgroud)
如这里提到但它失败了(两个半部也独立失败).
我错过了什么?当'进入'嵌套对象时,我不会只更新一个字段吗?
能够console.log request和它是非常有帮助的request.writeFields.
注意,理想情况下我只想允许修改最深的属性,当前用户的uid内部votes.
javascript firebase-security google-cloud-firestore firebase-security-rules
match /UserProfile {
match /{uId}{
allow get: if isUserLoggedIn() && !isUserBlocked(uId);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用上述安全规则从UserProfile / {uId}获取数据时,在Firestore和代码中抛出以下错误,提示权限不足:
Error running simulation — Error: simulator.rules line [199], column [28]. Function not found error: Name: [get].
Run Code Online (Sandbox Code Playgroud)
现在上面两个函数的定义在这里
function isUserLoggedIn(){
return request.auth != null;
}
function isUserBlocked(uId){
return (('blocked' in get(/databases/$(database)/documents/UserSettings/$(uId)).data) && (request.auth.uid in get(/databases/$(database)/documents/UserSettings/$(uId)).data.blocked));
}
Run Code Online (Sandbox Code Playgroud)
第一个功能运行得很好,但是第二个功能却不能
它抛出该错误
据我所知,功能还不错
请帮助我在这个问题上浪费了很多时间
任何人都知道如何验证基础instanceof?
这似乎是一个没有脑子的检查,但我在文档中找不到这种类型的验证的参考,我的尝试是不正确的.
如果值不是a,我想失败Date.它可能是Timestamp当前版本的firestore中的一个.
尝试失败
allow write: if request.resource.data.date instanceof Date;
allow write: if request.resource.data.date instanceof Timestamp;
allow write: if !!Timestamp(request.resource.data.date);
allow write: if !!rules.Timestamp(request.resource.data.date);
allow write: if !!rules.Timestamp.date(request.data.date);
allow write: if !!Timestamp.date(request.data.date);
allow write: if !!Timestamp(request.data.date);
Run Code Online (Sandbox Code Playgroud) 我在哭自己要睡这个。
我getAfter返回的对象只有一个字段,因为其他所有字段类型都不正确。我不知道如何在没有任何调试工具的情况下进行检查(我看不到数据,因此只能进行猜测和检查)。
这是我的规则的精简版本users。
match /users/{userId} {
function isValidUser(user) {
return user.id is string &&
(user.address is string || user.address == null) &&
(user.dateOfBirth is number || user.dateOfBirth == null) &&
user.email is string &&
user.name is string &&
(user.phoneNumber is string || user.phoneNumber == null);
}
function isValidWrite(userId, user) {
return signedIn() &&
writeHasMatchingId(userId, user) &&
isValidUser(user);
}
allow read: if signedIn();
allow create: if signedInAndWriteHasMatchingId(userId) &&
userHasId(userId) &&
isValidUser(request.resource.data); // Tested
allow update: if isValidWrite( …Run Code Online (Sandbox Code Playgroud)