我是新开发者,正在开发我的第一个 Firestore 应用。我已更改 Firestore 上的规则以使用户的数据更安全,但它不允许读/写。
这是关键行,我不知道如何针对我的应用进行配置 -
match /some_collection/{userId}/{documents=**} {
我不知道我是否将“some_collection”更改为我的集合名称,或者 some_collection 在这种意义上是否是参数本身的实际通配符类型。
另外,我是否需要以某种方式将用户 ID 从我的 swift 应用程序传递到 Firestore?在这一行中,userID 来自哪里?我更愿意制定规则,只有创建数据的用户才能读/写。我相信这个块是允许任何经过身份验证的用户,所以我只是试图探索每一步。
service cloud.firestore {
match /databases/{database}/documents {
// Allow only authenticated content owners access
match /some_collection/{userId}/{documents=**} {
allow read, write: if request.auth != null && request.auth.uid == userId
}
}
}
答案 0 :(得分:1)
解决您的问题:
<块引用>这是关键行,我不知道如何针对我的应用进行配置。
match /some_collection/{userId}/{documents=**}
我不知道我是否将“some_collection”更改为我的集合名称,或者 some_collection 在这种意义上是否是参数本身的实际通配符类型。
在上面的“some_collection”行中不是 firestore 通配符,您需要将 some_collection 替换为您集合的实际值。
<块引用>另外,我是否需要以某种方式将用户 ID 从我的 swift 应用程序传递到 Firestore?
是的,预计在从 firestore 读取或写入之前:
您已经创建并配置了firebase 对象。
firebase.initializeApp({
apiKey: '### FIREBASE API KEY ###',
authDomain: '### FIREBASE AUTH DOMAIN ###',
projectId: '### CLOUD FIRESTORE PROJECT ID ###'
});
您已经使用 firebase auth 对您的用户进行了身份验证。
firebase.auth().signInWithCustomToken(token)
.then((user) => {
// Signed in
// ...
})
.catch((error) => {
var errorCode = error.code;
var errorMessage = error.message;
// ...
});
传递 userId 是在调用 db 时由 firebase 对象完成的。 collection(“col123”).add 或任何其他方法。如果你看看 firestore 是如何initialized:
var db = firebase.firestore();
您将看到它与 firebase 对象的依赖关系。
<块引用>这一行中的用户 ID 来自哪里?
用户 ID 来自 firebase 对象。
<块引用>我相信这个块是允许任何经过身份验证的用户,所以我只是试图探索每一步。
是的,最后一条规则允许任何经过身份验证的用户读取/写入子集合/文档通配符 {userId}。
最后,您的 firestore 文档或子集合的 id 也应具有一定的命名一致性。
这意味着当您创建 firestore 文档时,使用 firebase.auth.uid 作为文档 ID。
否则,上面的规则将失败,因为 {userId} 后面的值不等于登录用户的 firebase.auth.uid。
实现后者,可以参考这个answer。
我强烈建议您查看此 video(来自 firebase 频道),因为它更详细地阐述了 Firestore 安全规则的核心概念。
我希望你觉得这很有用。