Ember-simple-auth可防止401响应时的会话失效

时间:2017-02-20 13:34:39

标签: ember.js ember-cli ember-simple-auth

我正在使用 Ember:2.11.0,ember-simple-auth:1.2.0

我使用ember-simple-auth通过oauth2验证我的应用程序到我的REST API。

如果服务器以401状态代码响应,则ember-simple-auth的标准行为是使用户会话无效。 我想处理这个不同并尝试覆盖这个:

import DS from 'ember-data';
import DataAdapterMixin from 'ember-simple-auth/mixins/data-adapter-mixin';

export default DS.RESTAdapter.extend(DataAdapterMixin, {
  host: 'http://localhost:3000',
  authorizer: 'authorizer:oauth2',

  /*
  * The DataAdapterMixin invalidetes the session automatically if the server
  * returns the status 401. We don't want this behaviour, so we override
  * the handleResponse method.
  */
  handleResponse(status) {
    console.log(status);
    return this._super(...arguments);
  }

});

在我的RestAdapter中我使用DataAdapterMixin触发handleResponse方法中的失效。 所以我试着在我的适配器中覆盖这个方法。我的方法被调用但是在我的方法完成之后,mixins方法被ember调用,你可以在这里看到:

enter image description here

Ember superWrapper方法状态的注释,它被用来处理对超类方法的调用并将它们重定向到它,但不知何故它似乎将它重定向到mixin。

我不知道为什么会这样。这可以通过直接编辑DataAdapterMixin来解决,但认为在与未来版本的ember-simple-auth的兼容性方面不是一个好主意

如果有人能指出我正确的方向使覆盖工作,我真的很感激。

1 个答案:

答案 0 :(得分:2)

当你从mixin扩展适配器时,this._super(...arguments);将调用mixin的方法(如果它有这样的方法)。这就是你的覆盖不起作用的原因。您有以下选择:

  1. 查看来自handleResponsestart from here)的ember数据源并复制DS.RESTAdapter代码。没有this._super电话 - 没有mixin的影响。这可能不是听起来那么容易,可能与未来版本的余烬数据不兼容
  2. 通过复制ember-simple-auth中的代码并删除/修改DataAdapterMixin方法来创建自己的handleResponse。这与ember-simpe-auth。
  3. 的未来版本不兼容
  4. 在致电arguments之前修改this._super(...arguments),因此状态将为400而不是401:

    handleResponse: function (status) {
      /**
       * Modify status
       */
      if (status === 401) {
        status = 400;
      }
    
      /**
       * Replace status in arguments.
       */
      var args = Array.prototype.slice.call(arguments, 0);
      args.splice(0, 1, status);
    
      /**
       * Call parent's method
       */
      return this._super(...args);
    }
    

    此方法与未来版本兼容 - 即使将添加新参数(参数为statusheaderspayload),此代码也可以使用。如果状态不再是第一个参数,它将停止工作(我不认为这将在不久的将来发生)。

  5. 但我还想说你的后端可能不对劲:401意味着"没有经过宣传"和ember-simple-auth做了在这种情况下应该做的事情 - 使会话无效。如果您在某些情况下需要特殊状态,我建议使用418(我是茶壶)。