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 方法解析返回的承诺时。