所以我有一个简单的ESA设置,其中包含自定义身份验证器/授权程序,包含Basic HTTP Auth。登录路由使用UnauthenticatedRouteMixin
,登录控制器基本上只对自定义身份验证器进行身份验证,然后从REST服务中提取用户对象:
export default Ember.Controller.extend({
session: Ember.inject.service('session'),
actions: {
login() {
var self = this;
let { userName, password } = this.getProperties('userName', 'password');
this.get('session').authenticate('authenticator:basicauth', userName, password).then(function ()
{
self.store.queryRecord('user', { loginname : userName }).then( function (user) {
console.log(user.get('id'));
self.get('session').set('data.filterUserId', user.get('id'));
});
}).catch((reason) => {
this.set('errorMessage', reason.error || reason);
});
}
}
});
现在,在第一个经过身份验证的路由中(通过AuthenticatedRouteMixin
),为了进行测试,我还只是console.log存储的会话属性:
import Ember from 'ember';
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
export default Ember.Route.extend(AuthenticatedRouteMixin, {
session: Ember.inject.service('session'),
model: function () {
console.log(this.get('session.data.filterUserId'));
},
});
在控制台输出中,我发现模型钩子似乎是在解析验证者的承诺之前执行的,即首先我得到“null”,然后是ID。
如何让AuthenticatedRoute等待实际的登录验证解析?
答案 0 :(得分:1)
Ember Simple Auth将在身份验证成功后立即转换为routeAfterAuthentication
,这在会话服务的authenticate
方法返回的承诺解析时是正确的。你只是在那之后异步加载用户,所以它只在转换之后才加载。
有关如何在会话进行身份验证时加载数据的示例,请参阅虚拟应用程序中的应用程序路径:https://github.com/simplabs/ember-simple-auth/blob/master/tests/dummy/app/routes/application.js
您必须知道,当用户在当前选项卡/窗口中登录时,以及当用户在另一个选项卡或窗口中登录时,会话可以进行身份验证(其中sessionAuthenticated事件基本上可以在任何时间触发) - 这就是为什么只要在应用程序路由上调用sessionAuthenticated
方法就需要加载会话进行身份验证时所需的所有数据(当然,您可以自己处理会话服务的authenticated
事件而不是使用ApplicationRouteMixin
)而不是会话服务的authenticate
方法返回的承诺解析时。