注销后权限缺失或权限不足错误

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 管理员权限缺失或不足

Firestore 安全规则:“PERMISSION_DENIED:权限缺失或不足。”

firebase 错误:FirebaseError:缺少权限或权限不足