我知道这个问题经常被问到,但是提出的解决方案并不能解决我的问题。
我试图建立一个基本的iOS Firestore应用程序,该应用程序在集合中写入一些文档。 我遵循标准过程,将GoogleService-Info.plist添加到我的项目中,并在启动时调用FirebaseApp.configure()。
我的Firestore规则如下:
@WebService(targetNamespace = "http://tempuri.org/", name = "MyService")
@EndpointProperties(value = {
@EndpointProperty(key = "webservice.security.authMethod", value = "WS-SECURITY")
@EndpointProperty(key = "ws-security.callback-handler", value = "org.tempuri.ServerPasswordCallback")
}
)
public interface MyService {
...
}
现在,一旦我尝试将某些内容保存在集合中,Firebase就会向我返回“权限被拒绝”错误。
但是,如果我的规则如下:
@EndpointProperty(key = "webservice.security.authMethod", value = "WS-SECURITY")
接受写入。显然,该请求似乎不包含任何身份验证信息,但是我找不到与此有关的任何其他文档。我错过了什么?
感谢您的帮助!
答案 0 :(得分:2)
我的猜测是,由于您不使用Firebase身份验证服务进行身份验证,因此该请求缺少身份验证信息。
摘自Firebase文档:
身份验证 最常见的安全规则模式之一是根据用户的身份验证状态控制访问。例如,您的应用可能希望仅允许登录用户写入数据
service cloud.firestore {
match /databases/{database}/documents {
// Allow the user to access documents in the "cities" collection
// only if they are authenticated.
match /cities/{city} {
allow read, write: if request.auth.uid != null;
}
}
}
https://firebase.google.com/docs/firestore/security/rules-conditions
您可以在通过Firebase身份验证服务进行身份验证后尝试该规则,并检查该规则是否通过。
答案 1 :(得分:2)
如果您在应用中使用身份验证,则应使用
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth.uid != null;
}
}
}
仅当您在应用中添加了Firebase身份验证时,此方法才有效,但如果未添加,则它将返回 PermissionDenied
您也可以使用此方法
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}
但是这种方法并不安全,任何人都可以一次更改整个数据库,而且Firebase不建议您使用此方法。
如果您处于开发模式,请使用它并创建数据库,但是如果要投入生产,则只需将其更改为任一模式即可。
allow read, write: if request.auth.uid != null;
或者如果您的应用程序中没有身份验证。
allow read, write: if false;
希望这可以帮助您更好地理解。