【发布时间】:2020-12-07 00:34:21
【问题描述】:
所以我试图在我的 Firestore 规则中将用户电子邮件与集合名称匹配,如下所示:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userEmail} {
allow read: if request.auth.token.email.matches(userEmail);
}
}
}
我知道将集合 ID 设置为电子邮件不是一个好习惯,但请假设它是 any 字符串。 上述方法不起作用。但是,如果我将 request.auth.token.email.matches(userEmail) 替换为 request.auth.token.email.matches("myemail@gmail.com"),它就可以正常工作。
上面我的用户集合中有一个 id = myemail@gmail.com 的文档,那么为什么当我使用 userEmail 变量时它不匹配,但如果我使用“myemail@gmail.com”字符串会匹配?
附加信息:
请求/getAccountInfo你可以看到myemail@gmail.com作为电子邮件
应用代码
我使用 Vuexfire 进行火库绑定。
store/index.js
bindUsers: firestoreAction(({bindFirestoreRef}) => {
return bindFirestoreRef("users", db.collection("users")
.where('email', '==', 'myemail@gmail.com');
}),
App.vue
async mounted() {
if (firebase.auth.currentUser) {
// Bind Vuexfire after if/when user exists to capture Firestore changes
await this.$store.dispatch("bindUsers");
}
}
【问题讨论】:
-
安全规则本身不做任何事情。它们仅在与来自网络或移动应用程序的特定查询配对时才有意义。请编辑您的问题以显示该代码,并证明(可能通过登录)用户在查询时使用正确的电子邮件地址登录。
-
@DougStevenson 我已经更新了我上面的截图。如果
request.auth.token.email.matches("myemail@gmail.com")有效,那么在我的应用程序加载时不会确认我有用户身份验证吗?只有当我替换为userEmail时,我才会得到FirebaseError: Missing or insufficient permissions.,并且您可以从我的屏幕截图中看到文档名称为myemail@gmail.com... 难道它不像@ 可能吗? -
我们需要执行查询的客户端应用程序代码,正如我在第一条评论中所述。截图并不能说明全部。
-
我正在使用 Vuexfire 绑定到我的集合,here。我只有在安装我的应用程序和
if (firebase.auth.currentUser)后才开始绑定。如果我更新规则以使用“myemail@gmail.com”字符串而不是 {user} 变量,我仍然很困惑为什么它会起作用? -
我认为您不能直接从“match /users/{userEmail}”行中使用“userEmail”变量(不是 100% 肯定,但这可能就是您当前 userEmail 值的原因无效。
标签: firebase google-cloud-firestore firebase-security