2017-02-20 204 views
0

我使用 恩贝尔:2.11.0,余烬,简单身份验证:1.2.0灰烬,简单权威性防止会话无效在401效应初探

我用余烬,简单AUTH通过验证我的应用程序oauth2到我的REST API。

ember-simple-auth的标准行为是在服务器响应401状态代码时使用户会话无效。 我要处理这个不同,并试图重写此:

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我使用它触发了用handleResponse方法中的无效宣告DataAdapterMixin。 所以我试图在我的适配器中覆盖此方法。我的方法被调用,但之后我的方法完成后,混入方法由烬叫,你可以在这里看到:

enter image description here

为灰烬superWrapper方法状态的评论,它是由处理将呼叫超类的方法并将它们重定向到它,但不知怎的,它似乎将它重定向到mixin。

我不知道为什么会发生这种情况。这可能可以通过直接编辑DataAdapterMixin来解决,但是认为这对于未来版本的兼容性来说不是一个好主意 - 简单验证

我真的很感谢如果有人能指出我的权利方向来使覆盖工作。

+0

其实用'this._super(...参数);'你调用混入'handleRresponse' –

回答

1

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

  1. 查找到烬数据源和复制从DS.RESTAdapterstart from herehandleResponse代码。没有this._super电话 - 没有来自mixin的影响。这可能不是那么容易,因为它听起来并且可能与未来版本的余烬数据不兼容。
  2. 通过从ember-simple-auth复制代码并删除/修改它的handleResponse方法创建您自己的DataAdapterMixin。这可能与未来版本的ember-simpe-auth不兼容。
  3. 修改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); 
    } 
    

    这种方法是与将来的版本兼容 - 即使新的参数将被添加(目前论点statusheaders ,​​),这段代码将起作用。如果状态不再是第一个参数,它将停止工作(我不认为这会在不久的将来发生)。

但我还想说的东西可能是不对的与你的后端:401的意思是“unathorized”和灰烬,简单权威性做什么应该在这种情况下做 - 无效会话。如果你在某些情况下需要特殊身份,我建议使用418(我是一个茶壶)。

+0

感谢您的帮助。你是对的,我会改变我的服务器代码。我对HTTP 401和403之间的差异感到困惑。我想处理用户被认证但不允许查看资源的情况。 403似乎更合适。 –