我想用ember.js实现身份验证.
因此,当应用程序启动时,在路由器处理请求的URL之前,我想检查用户状态.如果用户未经过身份验证,我想保存请求的URL并重定向到特定的URL(/ login).
我试图实现这个重载Ember.Route,但我认为这不是一个好习惯.
例如,如果我这样做:
var AuthRoute = Ember.Route.extend({
redirect: function() {
var controller = App.userController;
if (!controller.get("userAuth")) {
controller.set("lastFilter", this.routeName);
this.transitionTo("index");
}
}
}
});
如果,网址为’/ admin / foobar’,则管理路由将重定向而不是foobar.
我可以在路由器启动之前处理重定向吗?
最佳答案 我用的是这样的东西
Ember.SecureRoute = Ember.Route.extend({
role: null,
redirect: function (model) {
if (!this.controllerFor('login').get('authenticated')) {
this._routeToLogin();
}
var role = this.get('role');
if (!Ember.isEmpty(role) && !this.controllerFor('login').hasRole(role)) {
this._routeToLogin();
}
},
_routeToLogin: function () {
var infos = this.get('router.router.currentHandlerInfos');
this.router.router.didTransition(infos);
var routeName = !this.router.router.hasRoute(this.routeName) ? this.routeName + '.index' : this.routeName;
var params = infos.filter(function (item, index, enumerable) { return item.context !== undefined; }).map(function (item) { return item.context; })
var url = Ember.Router.prototype.generate.apply(this.router, params.insertAt(0, routeName))
this.router.location.setURL(url);
this.transitionTo("login");
}
});
在loginController中,您可以使用浏览器历史记录返回到原始路径
APP.LoginController = Ember.Controller.extend({
//other stuff
authenticate: function (username, password) {
//do the authentication
history.go(-1);
}
});