Emberjs:如何在会话无效后重定向到最后访问的路由
Emberjs: How to redirect to the last accessed route after session invalidated
我们正在使用 ember-simple-auth 和 cookie 身份验证,我们希望在 cookie 过期后再次登录后重定向到上次访问的路由。
我们设法为以下场景进行重定向:
- 未通过身份验证并尝试访问来自 url
的路由
- 未通过身份验证并且 select 导航菜单中的项目
两者,身份验证成功后,我们重定向到请求的路由。
但是,我们希望当我们的会话 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)
}
})
我用invalidationSucceded
here.
解决了
this.get('session').on('invalidationSucceeded', () => this.transitionToRoute('dashboard'))
我们正在使用 ember-simple-auth 和 cookie 身份验证,我们希望在 cookie 过期后再次登录后重定向到上次访问的路由。
我们设法为以下场景进行重定向:
- 未通过身份验证并尝试访问来自 url 的路由
- 未通过身份验证并且 select 导航菜单中的项目
两者,身份验证成功后,我们重定向到请求的路由。
但是,我们希望当我们的会话 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)
}
})
我用invalidationSucceded
here.
this.get('session').on('invalidationSucceeded', () => this.transitionToRoute('dashboard'))