我正在构建一个ember.js应用程序,身份验证挂起了。json rest后端是rails。每个请求都使用会话cookie (warden)进行身份验证。
当用户第一次导航到应用程序根目录时,rails会重定向到登录页面。一旦授权了会话,就会加载ember.js应用程序。加载后,ember.js应用程序使用ember-data RESTadapter和用于授权的会话向后端发出请求。
问题是会话将在预定时间后过期。很多时候,当这种情况发生时,ember.js应用程序仍然被加载。因此,所有到后端的请求都会返回401 {not autorized}响应。
为了解决这个问题,我认为ember.js应用程序需要在每次从服务器返回401 {非autorized}响应时使用登录模式通知用户。
有谁知道如何监听401 {非自动}响应,并允许用户重新登录而不丢失任何更改或状态。
我见过令牌授权等其他方法,但我担心其安全隐患。
对于这个问题,谁有一个可行的解决方案?
发布于 2012-11-13 12:09:34
ember-data的当前实现并没有解决这个问题,ember-data自述文件规定“处理错误状态”在Roadmap上。
目前,您可以实现自己的错误处理适配器。看一看implementation of the DS.RestAdapter。通过使用它作为起点,在其中添加错误处理应该不是太困难(例如,只需向传递给jQuery.ajax调用的数据散列添加一个错误函数)。
发布于 2013-09-28 03:47:09
从Ember Data的当前版本(1.0beta)开始,您可以覆盖DS.RESTAdapter
的ajaxError
方法
App.ApplicationAdapter = DS.RESTAdapter.extend({
ajaxError: function(jqXHR) {
var error = this._super(jqXHR);
if (jqXHR && jqXHR.status === 401) {
#handle the 401 error
}
return error;
}
});
请注意,您应该调用@_super
,特别是如果您要覆盖一个更复杂的适配器,如处理422 Unprocessable Entity
的DS.ActiveModelAdapter
。
发布于 2013-02-14 21:14:44
对于那些愿意接受丢失更改和状态的解决方案的人,您可以注册一个jQuery ajaxError处理程序以重定向到登录页面。
$(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) {
// You should include additional conditions to the if statement so that this
// only triggers when you're absolutely certain it should
if (jqXHR.status === 401) {
document.location.href = '/users/sign_in';
}
});
这段代码将在任何jQuery ajax请求完成但出现错误时触发。
当然,你永远不会实际使用这样的解决方案,因为它造成了令人难以置信的糟糕的用户体验。用户被拉离他们正在做的事情,他们失去了所有的状态。您真正要做的是呈现一个LoginView,可能是在一个模式中。
这个解决方案的另一个好处是,即使您偶尔向ember-data之外的服务器发出请求,它也能正常工作。危险在于,如果jQuery正被用于从其他来源加载数据,或者如果您已经在其他地方内置了一些401错误处理。您需要在上面的if语句中添加适当的条件,以确保只有在您绝对确定它们应该触发的情况下才会触发。
https://stackoverflow.com/questions/13349035
复制