注销后权限缺失或权限不足错误
Posted
技术标签:
【中文标题】注销后权限缺失或权限不足错误【英文标题】:Missing or insufficient permissions errors after logout 【发布时间】:2018-08-30 11:09:08 【问题描述】:我在一个项目中使用 Firebase + Ionic。注销时出现我的问题。我订阅了一些集合中的几个onSnapshot
事件。我希望每当用户注销时所有订阅都会被取消,但事实并非如此,所以每当我注销时,我都会收到来自 Firebase 的几个错误:
onSnapshot 中未捕获的错误:错误:缺失或不足 权限。
这是我的代码:
我的控制器
/**
* Logout button 'click' event handler
*/
onLogoutPressed()
this.fbAuthServ.logout().then(() =>
this.navCtrl.setRoot(LoginPage);
);
我的服务商
// Firebase Modules
import AngularFireAuth from 'angularfire2/auth';
constructor(private afAuth: AngularFireAuth, private utils: UtilsProvider)
...
/**
* Firebase Logout the current user
*/
async logout()
this.afAuth.auth.signOut();
您能告诉我应该怎么做才能避免那些Missing or insufficient permissions
错误吗??
提前谢谢你!
编辑:我如何订阅 onSnapshot 事件
控制器
ionViewDidEnter()
this.fbDataServ.getPlacesByUserAllowed().onSnapshot(placeReceived=>
this.placesByUserAllowed = placeReceived.docs.map(placeSnapshot =>
return this.utils.mapPlaceSnapshot(placeSnapshot )
);
this._concatPlaces();
//Dismiss loading whenever we have data available
this.utils.dismissLoading();
);
服务提供者
// Firebase
import AngularFirestore, AngularFirestoreCollection from 'angularfire2/firestore';
constructor(private afs: AngularFirestore, private fbAuthServ: FirebaseAuthServiceProvider, private utils: UtilsProvider)
placesCollection: AngularFirestoreCollection<PlaceModel> = this.afs.collection("places");
/**
* Gets the collection of places where the user is 'allowed'
*/
public getPlacesByUserAllowed()
return this.placesCollection.ref
.where('users.' + this.fbAuthServ.getCurrentUser().uid + '.allowed', '==', true);
【问题讨论】:
【参考方案1】:由于错误消息提到 onSnapshot
,我假设您正在代码中的某处访问 Firebase 数据库或 Cloud Firestore。
您从数据库中读取的数据配置了要求用户通过身份验证的安全规则。因此,当您注销用户时,不再满足该要求,应用程序将无法访问该数据,并且观察者被取消。
为防止出现此错误,请在注销用户之前移除观察者。
更新
要删除观察者/监听者,请遵循Firestore documentation on detaching a listener 中显示的模式。首先保留对从onSnapshot
获得的返回值的引用。
var unsubscribe = this.fbDataServ.getPlacesByUserAllowed().onSnapshot(placeReceived=>
然后在像这样注销用户之前调用unsubscribe()
:
unsubscribe();
【讨论】:
嗨弗兰克!谢谢,我知道我在 Firestore 中的规则。我的问题是关于如何在注销之前执行此“清理”过程。我怎样才能“删除观察者”?感谢您的帮助 这取决于你如何添加它们,不幸的是你没有分享代码。您能否更新您的问题以包含添加观察者的代码? 你是对的!!抱歉...我刚刚使用添加观察者的代码编辑了我的帖子 效果很好!!谢谢弗兰克!【参考方案2】:以下是截至 2021 年 8 月 30 日的更新链接和代码: https://firebase.google.com/docs/firestore/query-data/listen#handle_listen_errors
代码如下:
let listener = db.collection("cities").addSnapshotListener querySnapshot, error in
// ...
// Stop listening to changes
listener()
【讨论】:
以上是关于注销后权限缺失或权限不足错误的主要内容,如果未能解决你的问题,请参考以下文章
带有 Firebase 的 Angular - 应用检查后权限缺失或不足
Firebase Cloud Functions 无法写入 Firestore 数据库 - 权限缺失或不足
FirebaseError:[code=permission-denied]:权限缺失或不足
Node.js 中的 Firestore 管理员权限缺失或不足