Ember Simple Auth - 在身份验证承诺解析之前调用的经过身份验证的路由模型挂钩

时间:2016-02-12 08:30:08

标签: ember.js ember-simple-auth

所以我有一个简单的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等待实际的登录验证解析?

1 个答案:

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