根据条件,Ember simple-auth AuthenticatedRouteMixin或UnauthenticatedRouteMixin在路线上

时间:2016-10-12 18:54:21

标签: ember.js mixins ember-simple-auth

我的路由应该是AuthenticatedRouteMixinUnauthenticatedRouteMixin,具体取决于从服务器返回的响应。我该如何实现呢?

目前,我有一个AuthenticatedRouteMixin的路由,我通过覆盖我的beforeModel并执行willTransition操作强制对路由进行身份验证和解除身份验证,如下所示。

beforeModel() {
  this.set('session.isAuthenticated', true);
  return this._super(...arguments);
}

  actions: {
    willTransition: function(){
      if (Ember.isEmpty(_this.get('session.data.authenticated.token')))
      {
        this.set('session.isAuthenticated', false);
      }
    }
  }

然而,这有两个问题。

  1. 看起来和感觉都错了。可能有更好的方法 此。
  2. 对此有一些意想不到的后果。如果未登录然后尝试登录,则用户需要在重定向到相应页面之前刷新页面。我查看了simple-auth代码,并且transitionTo函数没有按预期运行。

    sessionAuthenticated() {
      const attemptedTransition = this.get('session.attemptedTransition');
    
      if (attemptedTransition) {
        attemptedTransition.retry();
        this.set('session.attemptedTransition', null);
      } else {
        this.transitionTo(Configuration.routeAfterAuthentication);
      }
    }
    
  3. this.transitionTo(Configuration.routeAfterAuthentication);是未转换的行。我已经确认Configuration.routeAfterAuthentication设置正确。

    我可能会强制重新加载登录路线或用户导航到的路线,但(我认为)由于上面的问题2,我遇到无限重定向。

    我很乐意做以下事情:

    import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
    import UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin';
    
    const { service } = Ember.inject;
    
    var mixin;
    if (service('session').isAuthenticated){
      mixin = AuthenticatedRouteMixin;
    }
    else{
      mixin = UnauthenticatedRouteMixin;
    }
    
    export default Ember.Route.extend(mixin, { ... })
    

    但是,我没有从会话中获取信息。我不确定,但是可能需要加载特定的Ember.Route来获取该信息。

    非常感谢任何帮助。

    更新

      

    我可能会强制在登录路线重新加载或在路由用户的地方重新加载   导航到,但(我认为)由于上面的问题2,我正在运行   进入无限重定向。

    我想出了这一部分。我只是在会话中设置了一个键/值。如果是,则重新加载并删除密钥或将其设置为false,因此重新加载仅发生一次。

1 个答案:

答案 0 :(得分:0)

嗯,正确的方法是在您的路线中手动完成混音。查看source code.

不是那么难吗?有趣的是:为什么在会话通过时需要AuthenticatedRouteMixin,而在会话未通过时UnauthenticatedRouteMixin?这与你不包括任何混音时的行为基本相同。

因为AuthenticatedRouteMixin仅在会话未经过身份验证时更改行为,并且UnauthenticatedRouteMixin仅在路由经过身份验证时更改行为。

但是你的路线中有类似的东西是你要求的:

beforeModel(transition) {
  if(...) {
    if (!this.get('session.isAuthenticated')) {
      transition.abort();
      this.set('session.attemptedTransition', transition);
      this.transitionTo(Configuration.authenticationRoute);
      return;
    }
  } else {
    if (this.get('session').get('isAuthenticated')) {
      transition.abort();
      this.transitionTo(Configuration.routeIfAlreadyAuthenticated);
      return;
    }
  }
  return this._super(...arguments);
},