将用户作为计算结果保存到会话 属性

Saving a user to a session as a computed property

我看到了有关此的其他问题(例如 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-jsonapi-resources 的问题,而不是 Ember Simple Auth。

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

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

// 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 对此的直觉是正确的),另一部分是我的编码错误。

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

像这样设置自定义会话:

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 您未使用的数据的一部分 - 我不知道您选择的库中是否有等效项。