2016-05-25 5 views
2

cookie認証でember-simple-authを使用しており、Cookieの有効期限が切れたときに再度ログインした後に最後にアクセスしたルートにリダイレクトします。

私たちは、次のシナリオのためのリダイレクトを行うために管理:Emberjs:セッションが無効になった後に最後にアクセスしたルートにリダイレクトする方法

  1. が認証されていないと認証され、ナビゲーションメニュー

両方から項目を選択しない

  • URLからルートにアクセスしようと、認証が成功した後、リクエストされたルートにリダイレクトされました。

    ただし、セッションクッキーの有効期限が切れ、ユーザーがセッションを無効にしてユーザーを認証ページにリダイレクトするルートにアクセスしようとするとします。ユーザーがログインしたら、要求されたルートにリダイレクトします。

    ここではリダイレクトを行うことができるように以前の遷移を保存しますが、セッションを無効にした後はデータが失われます。

    これを行うにはどのような方法が最適ですか?

    カスタム認証

    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 
         }); 
        } 
        } 
    }); 
    
  • 答えて

    1

    あなたは以前のトンを追加することができます

    私たちのコードは次のようになりますこのようなセッションデータ内での遷移は、このようにセッションが無効にされた後も維持されるため、このような場合は

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

    です。その後、 そして、ストアからそれを取り戻す、および移行を行います。

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

    ありがとうございました。それは非常に役に立ちます。 – Panagiotis

    0

    私はinvalidationSuccededhereを使用して、それを解決しました。

    this.get('session').on('invalidationSucceeded',() => this.transitionToRoute('dashboard')) 
    
    関連する問題