我正在使用 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调用,你可以在这里看到:
Ember superWrapper方法状态的注释,它被用来处理对超类方法的调用并将它们重定向到它,但不知何故它似乎将它重定向到mixin。
我不知道为什么会这样。这可以通过直接编辑DataAdapterMixin来解决,但认为在与未来版本的ember-simple-auth的兼容性方面不是一个好主意
如果有人能指出我正确的方向使覆盖工作,我真的很感激。
答案 0 :(得分:2)
当你从mixin扩展适配器时,this._super(...arguments);
将调用mixin的方法(如果它有这样的方法)。这就是你的覆盖不起作用的原因。您有以下选择:
handleResponse
(start from here)的ember数据源并复制DS.RESTAdapter
代码。没有this._super
电话 - 没有mixin的影响。这可能不是听起来那么容易,可能与未来版本的余烬数据不兼容DataAdapterMixin
方法来创建自己的handleResponse
。这与ember-simpe-auth。在致电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);
}
此方法与未来版本兼容 - 即使将添加新参数(参数为status
,headers
,payload
),此代码也可以使用。如果状态不再是第一个参数,它将停止工作(我不认为这将在不久的将来发生)。
但我还想说你的后端可能不对劲:401意味着"没有经过宣传"和ember-simple-auth做了在这种情况下应该做的事情 - 使会话无效。如果您在某些情况下需要特殊状态,我建议使用418(我是茶壶)。