Emberjs:如何在会话失效后重定向到上次访问的路由

时间:2016-05-25 13:01:06

标签: ember.js ember-simple-auth

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

我们设法对以下场景进行重定向:

  1. 未经过身份验证,并尝试访问来自网址的路由
  2. 未经过身份验证,并从导航菜单中选择一个项目
  3. 在成功验证后,我们都重定向到请求的路由。

    但是,我们希望当会话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
          });
         }
       }
    });
    

2 个答案:

答案 0 :(得分:1)

您可以在会话数据中添加上一个转换,例如

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

因为会话失效后仍然存在。 然后从商店取回,并进行转换:

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

答案 1 :(得分:0)

我使用invalidationSucceded here解决了这个问题。

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