Ember.js Emberjs:会话无效后如何重定向到上次访问的路由

Ember.js Emberjs:会话无效后如何重定向到上次访问的路由,ember.js,ember-simple-auth,Ember.js,Ember Simple Auth,我们正在使用带有cookie身份验证的ember simple auth,我们希望在cookie过期时再次登录后重定向到上次访问的路由我们设法为以下场景执行重定向: 未通过身份验证,尝试从url访问路由 未验证,请从导航菜单中选择一个项目 在成功的身份验证之后,我们重定向到请求的路由 但是,我们希望在会话cookie过期时,用户尝试访问路由以使会话无效并将用户重定向回身份验证页面。当用户重新登录时,我们希望将其重定向到请求的路由目前,我们存储上一个转换,以便进行重定向,但在使会话无效后,数据将丢

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

我们设法为以下场景执行重定向:

  • 未通过身份验证,尝试从url访问路由
  • 未验证,请从导航菜单中选择一个项目
  • 在成功的身份验证之后,我们重定向到请求的路由

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

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

        this.get('session').set('data.previousTransition', transition.targetName);
    
    因为在会话无效后,它仍然保持不变。 然后从商店取回,并进行转换:

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

    我用
    invalizationsuccedd
    解决了这个问题


    非常感谢你,伊戈尔。这很有帮助。
    this.get('session').on('invalidationSucceeded', () => this.transitionToRoute('dashboard'))