Ember 路由上的 simple-auth AuthenticatedRouteMixin 或 UnauthenticatedRouteMixin 取决于条件

Ember simple-auth AuthenticatedRouteMixin or UnauthenticatedRouteMixin on route depending on condition

我有一条路线应该是 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. 这会产生一些意想不到的后果。如果未登录然后尝试登录,则用户需要在重定向到相应页面之前刷新页面。我查看了简单授权代码,发现 transitionTo 函数未按预期运行。

    sessionAuthenticated() {
      const attemptedTransition = this.get('session.attemptedTransition');
    
      if (attemptedTransition) {
        attemptedTransition.retry();
        this.set('session.attemptedTransition', null);
      } else {
        this.transitionTo(Configuration.routeAfterAuthentication);
      }
    }
    

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 才能获取该信息。

如有任何帮助,我们将不胜感激。

更新

I may force a reload at the login route or where ever route a user navigates to, but (I think) because of issue 2 above, I am running into infinite redirects.

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

好吧,正确的方法是在您的路线中手动进行混音。查看 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);
},