【问题标题】:Saving a user to a session as a computed property将用户作为计算属性保存到会话
【发布时间】:2015-07-26 21:18:39
【问题描述】:

我已经看到有关此的其他问题(例如 this one),我相信这应该有效

import Ember from 'ember';
import Session from 'simple-auth/session';

export default {
  name: 'session-with-me',
  before: 'simple-auth',
  initialize: function() {
    Session.reopen({
      me: function() {
        if (this.get('isAuthenticated')) {
          return this.container.lookup('service:store').find('me', { singleton: true });
        }
      }.property('isAuthenticated')
    });
  }
};

find('me', { singleton: true }) 是 ember-jsonapi-resources 的工作补丁。在调试时,我可以看到正在发送的请求,并且有效负载通过了。我在应用程序的其他地方使用了相同的find 调用,并且可以确认模型被实例化得很好。

在检查器上,container > simple-auth-session 下我可以看到 me 作为会话属性,但它显示为 { _id: 68, _label: undefined ...}

设置会话属性的方式是否改变了?我可能在某处看到过有关此内容的提及,但我再也找不到了。

这与another question I asked earlier 在同一个域中,但我放弃了这种方法,并尝试简单地获取独立于身份验证过程的用户。

【问题讨论】:

    标签: ember.js ember-simple-auth


    【解决方案1】:

    像这样设置自定义会话:

    export default Session.extend({
      me: function() {
        var accessToken = this.get('secure.access_token');
        if (!Ember.isEmpty(accessToken)) {
          return DS.PromiseObject.create({
            promise: this.container.lookup('service:me').find({});
          });
        }
      }.property('secure.access_token')
    });
    
    // app/config/environment.js
    ENV['simple-auth'] = {
      session: 'session:me'
    }
    

    DS.PromiseObject 实际上是您未使用的 Ember Data 的一部分 - 我不知道您选择的库中是否有等价物。

    【讨论】:

    • 没有,但我在slack上问过,看起来内联定义就像var PromiseObject = Ember.ObjectProxy.extend(Ember.PromiseProxyMixin);一样简单
    【解决方案2】:

    这很可能是 ember-jsonapi-resources 的问题,而不是 Ember 简单身份验证的问题。

    虽然您应该定义自己的会话来扩展 Ember Simple Auth 提供的默认会话,而不是重新打开会话 - 请参见例如这个答案:How to store the user in a session

    【讨论】:

      【解决方案3】:

      我们最终让它像这样工作:

      // app/sessions/me.js
      export default Session.extend({
        me: function() {
          var accessToken = this.get('secure.access_token');
          if (!Ember.isEmpty(accessToken)) {
            let self = this;
            return this.container.lookup('service:me').find({}).then((me) => {
              self.set('me', me);
            });
          }
        }.property('secure.access_token')
      });
      
      // app/config/environment.js
      ENV['simple-auth'] = {
        session: 'session:me'
      }
      

      这部分是由于 EJR 中资源服务的初始化方式(所以 @marcoow 对此的预感是正确的),另一部分只是我的编码错误。

      有趣的是,我们不必在容器中显式注册会话

      【讨论】:

      • 虽然设置一个名为 cp 的属性并不是很好(它有效地替换了 cp)。我认为使用您的解决方案,一旦用户注销,me 属性也将保留其价值。您应该返回承诺或将其包装在承诺对象中,或者使用设置(或取消设置)me 属性的观察者。
      • @marcoow 我明白了。那时我“不接受”我的回答。问题是,我尝试了承诺路线,但我真的还不精通如何使用它们。 SO上的这两个问题也是关于这个的,我在问这段代码会是什么样子。参考是有帮助的,因为它指出了上述解决方案的问题,但并不是我在这里真正需要的——我正在寻找最终的解决方案。看看 ESA 1.0 将如何实现这一点会特别有趣
      猜你喜欢
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 2012-02-06
      • 2019-07-06
      • 1970-01-01
      相关资源
      最近更新 更多