【问题标题】:Closing an emberfire/torii session and logging out throws permission_denied errors关闭 emberfire/torii 会话并注销会引发 permission_denied 错误
【发布时间】:2016-06-28 19:45:14
【问题描述】:

我正在使用 EmberFire 和 Torii 进行会话。当我注销用户时,我遇到了一个奇怪的问题,并且在控制台中抛出了以下错误:

firebase.js:186 Error: permission_denied at /folders/-KKvrk3K_JOHxQWgR1km: Client doesn't have permission to access the desired data.(…)(anonymous function) @ firebase.js:186(anonymous function) @ firebase.js:380Tb @ firebase.js:276uc @ firebase.js:263vc @ firebase.js:262(anonymous function) @ firebase.js:449vh @ firebase.js:434g.wd @ firebase.js:425Ye.wd @ firebase.js:328(anonymous function) @ firebase.js:326vd @ firebase.js:279La.onmessage @ firebase.js:278
firebase.js:186 Error: permission_denied at /folders/-KLFp3zh5QUB7KvMF0HZ: Client doesn't have permission to access the desired data.(…)(anonymous function) @ firebase.js:186(anonymous function) @ firebase.js:380Tb @ firebase.js:276uc @ firebase.js:263vc @ firebase.js:262(anonymous function) @ firebase.js:449vh @ firebase.js:434g.wd @ firebase.js:425Ye.wd @ firebase.js:328(anonymous function) @ firebase.js:326vd @ firebase.js:279La.onmessage @ firebase.js:278
firebase.js:186 Error: permission_denied at /externalApps/-KLF_wKXtzm38EHtuQ_C: Client doesn't have permission to access the desired data.(…)(anonymous function) @ firebase.js:186(anonymous function) @ firebase.js:380Tb @ firebase.js:276uc @ firebase.js:263vc @ firebase.js:262(anonymous function) @ firebase.js:449vh @ firebase.js:434g.wd @ firebase.js:425Ye.wd @ firebase.js:328(anonymous function) @ firebase.js:326vd @ firebase.js:279La.onmessage @ firebase.js:278
firebase.js:186 Error: permission_denied at /users/-KLKUOZRBCIeCj44WMe7: Client doesn't have permission to access the desired data.(…)(anonymous function) @ firebase.js:186(anonymous function) @ firebase.js:380Tb @ firebase.js:276uc @ firebase.js:263vc @ firebase.js:262(anonymous function) @ firebase.js:449vh @ firebase.js:434g.wd @ firebase.js:425Ye.wd @ firebase.js:328(anonymous function) @ firebase.js:326vd @ firebase.js:279La.onmessage @ firebase.js:278
firebase.js:186 Error: permission_denied at /externalApps/-KLIyXUwTSrkCIL4rz7U: Client doesn't have permission to access the desired data.

我有两个地方登录用户:

注册时

register(data) {
  return this.get('firebaseApp')
    .auth()
    .createUserWithEmailAndPassword(data.email, data.password)
    .then((registeredUser) => {
      const newUser = this.store.createRecord('user', {
        uid: registeredUser.uid,
        firstName: data.firstName,
        lastName: data.lastName,
        email: registeredUser.email
      })
      return newUser.save();
    })
    .then((savedUser) => {
      return this.get('session').fetch().then(() => {
        return savedUser;
      });
    })
    .then((savedUser) => {
      this.replaceWith('dashboard');
    });
}

对于已经注册的用户

login(email, password) {
  const controller = this.controllerFor('index');
  this.get('session').open('firebase', {
    provider: 'password',
    email: email,
    password: password
  })
  .then((/* response */) => {
    controller.set('loginError', undefined);
    this.replaceWith('dashboard');
  })
  .catch((error) => {
    controller.set('loginError', error);
  });
}

这是将用户注销的操作:

logout() {
  this.get('session').close().then(() => {
    this.store.unloadAll();
    this.replaceWith('index');
  });
}

【问题讨论】:

    标签: ember.js ember-data emberfire torii


    【解决方案1】:

    大约一周前,我遇到了同样的问题。似乎 Emberfire 在那里实现 Ember Data 扩展的方式不允许使用store.unloadAll()

    我打开了一个问题here,但没有看到团队的任何回复。

    您可以通过直接从商店卸载用户来轻松解决此问题。只要您使用store.unloadRecord(<specificRecord>)<specificRecord.unload() 就一切正常。

    在您的情况下,您可以在登录或注册新用户时保存用户记录,然后在注销时卸载该记录。如果所有这些操作不在同一个控制器中,您可能必须创建一个服务来处理该交互。

    希望有帮助

    【讨论】:

      【解决方案2】:

      2 年后错误仍然存​​在 :) 所以真正快速而肮脏的解决方案可以避免控制台中的错误。关于this 评论“emberfire 在加载后永远不会停止收听任何记录”。因此,要从 Firebase 服务器“断开连接”,我们可以简单地打开(我的意思是完整的 app[=page] 重新加载)没有任何 emberdata 元素的页面。 所以我的解决方案(应用程序中的任何宫殿):

      actions: {
          signOut: function () {            
              window.location.replace('/login');
          }
      }
      

      关于登录路径:

      beforeModel(){
          if (this.get('session').get('isAuthenticated')) {            
              this.get('session').close()
          }
      }
      

      关于我的设置的一些信息:

      调试:Ember:3.1.3

      调试:Ember 数据:3.1.1

      调试:Firebase:3.9.0

      调试:EmberFire:2.0.10

      调试:jQuery:3.3.1

      希望这将有助于避免页面上的错误。如果应用程序真的很大,也许是个坏主意。

      【讨论】:

        【解决方案3】:

        @Paul 回答的关键是:

        actions: {
          signOut: function () {            
            window.location.replace('/login');
          }
        }
        

        如果您使用的是 Emberfire 和 Torii 提供程序,那么您需要重新获取会话才能关闭它。这就是我在sign-out 路线中所做的...

        export default Route.extend({
          session: inject(),
          redirect() {
            get(this, 'session')
              .fetch()
              .then(async () => {
                await get(this, 'session').close();
                this.transitionTo('/sign-in');
              });
          },
          setupController(controller, model) {
            this._super(controller, model);
          }
        });
        

        我在此路由中设置了一个控制器,以便在应用获取会话时显示加载微调器。

        【讨论】:

          猜你喜欢
          • 2015-02-13
          • 1970-01-01
          • 2018-02-21
          • 1970-01-01
          • 2013-02-09
          • 2014-08-24
          • 2014-01-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多