我有一个这样的数据结构(集合和文档,而不是JSON当然,但你明白了):
{
users: {
user1:{
name: Alice,
groups: {
groupA:{subbed:true},
groupB:{subbed:true}
}
},
user2:{
name: Bob,
groups: {
groupC:{subbed:true},
groupD:{subbed:true}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,这是注册用户ID和每个用户订阅的组ID.我想编写一个安全规则,只有当他们是当前的auth用户时才允许访问用户配置文件和子集合,并且根据我对文档的阅读,我认为通配符可以实现这一点......
match /users/{user=**}{
allow read,write: if user == request.auth.uid;
}
Run Code Online (Sandbox Code Playgroud)
有了这个,我可以正常阅读user
文档,但是当我尝试阅读groups
子集时,我收到权限错误.我只能通过明确匹配子集合来使其工作...
match /appUsers/{user}{
allow read,write: if user == request.auth.uid;
match /groups/{group}{
allow read,write: if user == request.auth.uid;
}
}
Run Code Online (Sandbox Code Playgroud)
...所以我的问题是,两个例子之间有什么区别,我对递归通配符有什么误解?我认为{user=**}
第一个示例的部分应该user
无限制地授予对文档及其所有子集合,子子集合等的访问权限(对于授权用户),并且应该不需要专门为存储的数据编写规则我在第二个例子中不得不这样做.
我只是在短时间内搞乱Firestore,所以这可能是一个真正愚蠢的问题:)
谢谢大家
我们可以让Firestore将记录下载到本地缓存,并可以读取这些记录.但是,我们无法更新记录,也无法添加新记录.
甚至尝试了一些相同的代码(https://github.com/firebase/quickstart-android),但似乎无法使离线写/插入工作 - 只读.
当我们将此函数调用为脱机时,它将被调用OnFailureListner并抛出异常
@Override
public void onRating(Rating rating) {
// In a transaction, add the new rating and update the aggregate totals
addRating(mRestaurantRef, rating)
.addOnSuccessListener(this, new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "Rating added");
// Hide keyboard and scroll to top
hideKeyboard();
mRatingsRecycler.smoothScrollToPosition(0);
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "Add rating failed", e);
// Show failure message and hide keyboard
hideKeyboard();
Snackbar.make(findViewById(android.R.id.content), "Failed to add …
Run Code Online (Sandbox Code Playgroud) 我在使用Cloud函数和Firestore规则时遇到了一些麻烦。我想在Firestore上使用具有有限特权的云功能,并且仅授予安全规则中定义的访问权限
它在RTDB上正常运行,但在Firestore上却没有问题。
我尝试了这个规则
service cloud.firestore {
match /databases/{database}/documents {
match /init/{ID=**} {
allow read, write: if true;
}
match /test/{ID=**} {
allow read, write: if false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
和这个
const admin = require('firebase-admin');
const functions = require('firebase-functions');
const FieldValue = require('firebase-admin').firestore.FieldValue;
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: 'https://******.firebaseio.com',
databaseAuthVariableOverride: {
uid: 'my-worker',
},
});
const db = admin.firestore();
exports.onTestRights = functions.firestore
.document('init/{initID}')
.onCreate((event) => {
const initID = event.params.initID;
return db.collection('test').doc(initID).set({'random key': 'random value'}).then(()=>{
console.log('working');
return;
}).catch((err) =>{
console.log('error: ', err); …
Run Code Online (Sandbox Code Playgroud) javascript firebase firebase-security google-cloud-functions google-cloud-firestore