【问题标题】:Emberjs: How to redirect to the last accessed route after session invalidatedEmberjs:会话无效后如何重定向到最后访问的路由
【发布时间】:2016-05-25 13:01:06
【问题描述】:

我们正在使用带有 cookie 身份验证的 ember-simple-auth,我们希望在 cookie 过期时再次登录后重定向到最后访问的路由。

我们设法针对以下情况进行重定向:

  1. 未通过身份验证并尝试从 url 访问路由
  2. 未通过身份验证并从导航菜单中选择一个项目

两者,在成功认证后,我们重定向到请求的路由。

但是,我们希望我们的会话 cookie 过期并且用户尝试访问路由以使会话无效并将用户重定向回身份验证页面。当用户重新登录时,我们希望将他重定向到请求的路线。

现在我们存储上一个转换,以便我们可以进行重定向,但在我们使会话无效后,数据会丢失。

最好的方法是什么?

我们的代码如下:

自定义身份验证器

import Ember from 'ember';
import Base from 'ember-simple-auth/authenticators/base';

export default Base.extend({
  restore() {
    return new Ember.RSVP.Promise(function(resolve, reject) {
      let sessionCookie = window.Cookies.get('beaker.session.id');
      if(!window.isUndefined(sessionCookie)) {
        resolve(true);
      }else{
        reject();
      }
    });
  },
  authenticate(data) {
    return new Ember.RSVP.Promise(function (resolve, reject) {
      Ember.$.ajax({
        type: 'post',
        url: '/core/authentication/basic/login',
        data: data
      }).then((response) => {
        resolve({
          responseText: response
        });
      }, (error) => {
        reject(error);
      });
    });
  },
  invalidate() {
    return new Ember.RSVP.Promise(function (resolve, reject) {
      Ember.$.ajax({
        type: 'post',
        url: '/core/authentication/basic/logout'
      }).then(() => {
        resolve(true);
      }, () => {
        reject();
      });
   });
  }
});

申请途径:

import Ember from 'ember';
import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin';

export default Ember.Route.extend(ApplicationRouteMixin, {
  session: Ember.inject.service('session'),
  beforeModel(transition) {
    if(!this.get('session.isAuthenticated') && transition.targetName !== 'core.authentication') {
      this.set('previousTransition', transition);
      this.transitionTo('core.authentication');
    }
  },
  actions: {
    willTransition(transition) {
      if (!this.get('session.isAuthenticated')) {
        this.set('previousTransition', transition);
      } else {
        let previousTransition = this.get('previousTransition');
        if (previousTransition) {
          this.set('previousTransition', null);
          previousTransition.retry();
        }
      }
    }
  }
 });

认证路径

import Ember from 'ember';

export default Ember.Route.extend({
  session: Ember.inject.service('session'),
  actions: {
    login() {
      let that = this;
      let { username, password } = this.controller.getProperties('username', 'password');
      let data = {username: username, password: password};

      if(this.get('session.isAuthenticated')) {
        this.get('session').invalidate();
      }

      this.get('session').authenticate('authenticator:basic', data).then(() => {
        let data = that.get('session.data.authenticated');
        // show response message
      }, (error) => {
        // show error
      });
     }
   }
});

【问题讨论】:

    标签: ember.js ember-simple-auth


    【解决方案1】:

    您可以在会话数据中添加上一个转换,像这样

        this.get('session').set('data.previousTransition', transition.targetName);
    

    因为会话失效后它仍然存在。 然后从商店取回,然后进行过渡:

    this.get('session.store').restore().then(data => {
      if (data.previousTransition !== null) {
       this.transitionTo(data.previousTransition)
       }
    })
    

    【讨论】:

    • 非常感谢伊戈尔。这很有帮助。
    【解决方案2】:

    我用invalidationSuccededhere解决了这个问题。

    this.get('session').on('invalidationSucceeded', () => this.transitionToRoute('dashboard'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多