首先,我不使用Ruby也不使用Devise :)(我所有的搜索都让我得到了那些依赖于Devise的插件)
我想用Ember进行非常简单的身份验证,我有一个REST后端,可以在没有正确cookie的情况下阻止请求(用户通行证),我希望Ember能够看到它被禁止403(赢了,不要让你去转换为受保护的URL)然后弹出用户登录对话框。
因此,当用户尝试发送新消息时(假设我已经构建了一个论坛),Ember将触发请求,如果它获得403,它将阻止转换并弹出登录表单并重试登录完成后的转换
还有办法从ember-data中获取错误并对它们做出响应吗? (如果用户试图更改他无法访问的属性,我想通知他[访问被拒绝或类似的东西]) 我想使用我的服务器发送的自定义错误来包含数据而不仅仅是错误数字,而不是像&#34这样的词;抱歉,您无法在下午12点之前更改此内容"
答案 0 :(得分:2)
您只需听取服务器的响应并转换到您的LOGIN(或任何您称之为)路由。在我的应用程序中,我碰巧保留了两种类型的路由(LOGIN和AUTHENTICATED)。当他们在没有登录的情况下访问经过身份验证的路由时,会收到401未经授权的错误并转换到LOGIN路由。
// AuthenticatedRoute.js
redirectToLogin: function(transition) {
// alert('You must log in!');
var loginController = this.controllerFor('login');
loginController.set('attemptedTransition', transition);
this.transitionTo('login');
},
events: {
error: function(reason, transition) {
if (reason.status === 401) {
this.redirectToLogin(transition);
} else {
console.log(reason);
window.alert('Something went wrong');
}
}
},
model: function () {
return this.store.find('post');
},
所以现在当用户请求发布时,他获得了401并转换到了LOGIN控制器。
// LoginController.js
login: function() {
var self = this, data = this.getProperties('username', 'password');
// Clear out any error messages.
this.set('errorMessage', null);
$.post('/login', data).then(function(response) {
self.set('errorMessage', response.message);
if (response.success) {
alert('Login succeeded!');
// Redirecting to the actual route the user tried to access
var attemptedTransition = self.get('attemptedTransition');
if (attemptedTransition) {
attemptedTransition.retry();
self.set('attemptedTransition', null);
} else {
// Redirect to 'defaultRoute' by default.
self.transitionToRoute('defaultRoute');
}
}
});
}
您需要的基本答案是捕获路线中的事件并相应地转换。我碰巧包含了尝试过渡的代码,因为它有时会派上用场。