Ember 简单身份验证 - 在身份验证承诺解析之前调用的身份验证路由模型挂钩
Ember Simple Auth - authenticated route model hook called before authenticate promise resolves
所以我有一个简单的 ESA 设置,带有自定义 authenticator/authorizer 包装基本 HTTP 身份验证。登录路由使用 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等待实际登录认证解析?
Ember 简单身份验证将在身份验证成功后立即转换为 routeAfterAuthentication
,这恰好是会话服务的 authenticate
方法返回的承诺解析时。在那之后你只是异步加载用户,所以它只在已经完成的转换之后加载。
有关如何在会话通过身份验证时加载数据的示例,请参阅虚拟应用程序中的应用程序路由:https://github.com/simplabs/ember-simple-auth/blob/master/tests/dummy/app/routes/application.js
您必须知道,当用户登录当前 tab/window 时以及用户登录另一个选项卡或 window 时(其中 sessionAuthenticated 事件可能基本上可以随时触发) - 这就是为什么只要在应用程序路由上调用 sessionAuthenticated
方法时,你就需要加载会话验证时所需的所有数据(当然你可以处理会话服务的 authenticated
自己而不是使用 ApplicationRouteMixin
) 事件,而不是在会话服务的 authenticate
方法解析返回的承诺时。
所以我有一个简单的 ESA 设置,带有自定义 authenticator/authorizer 包装基本 HTTP 身份验证。登录路由使用 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等待实际登录认证解析?
Ember 简单身份验证将在身份验证成功后立即转换为 routeAfterAuthentication
,这恰好是会话服务的 authenticate
方法返回的承诺解析时。在那之后你只是异步加载用户,所以它只在已经完成的转换之后加载。
有关如何在会话通过身份验证时加载数据的示例,请参阅虚拟应用程序中的应用程序路由:https://github.com/simplabs/ember-simple-auth/blob/master/tests/dummy/app/routes/application.js
您必须知道,当用户登录当前 tab/window 时以及用户登录另一个选项卡或 window 时(其中 sessionAuthenticated 事件可能基本上可以随时触发) - 这就是为什么只要在应用程序路由上调用 sessionAuthenticated
方法时,你就需要加载会话验证时所需的所有数据(当然你可以处理会话服务的 authenticated
自己而不是使用 ApplicationRouteMixin
) 事件,而不是在会话服务的 authenticate
方法解析返回的承诺时。