cookie認証でember-simple-authを使用しており、Cookieの有効期限が切れたときに再度ログインした後に最後にアクセスしたルートにリダイレクトします。
私たちは、次のシナリオのためのリダイレクトを行うために管理:Emberjs:セッションが無効になった後に最後にアクセスしたルートにリダイレクトする方法
- が認証されていないと認証され、ナビゲーションメニュー
両方から項目を選択しない
ただし、セッションクッキーの有効期限が切れ、ユーザーがセッションを無効にしてユーザーを認証ページにリダイレクトするルートにアクセスしようとするとします。ユーザーがログインしたら、要求されたルートにリダイレクトします。
ここではリダイレクトを行うことができるように以前の遷移を保存しますが、セッションを無効にした後はデータが失われます。
これを行うにはどのような方法が最適ですか?
カスタム認証
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
});
}
}
});
ありがとうございました。それは非常に役に立ちます。 – Panagiotis