4

我想用 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");
            }  
        }  
    }  
});

如果 url 是 '/admin/foobar',则 admin 路由将重定向而不是 foobar。

我可以在路由器启动之前处理重定向吗?

4

3 回答 3

1

我用这样的东西

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);
  }
});
于 2013-03-15T10:10:52.480 回答
1

我这样做的方式是将经过身份验证的用户与我的数据一起传递。我的主应用程序中有一个 initConfiguration 函数

所以在索引文件里面(在这种情况下我给你看玉)我有这个:

// initialize ember settings
script(type='text/javascript')
    App.initConfiguration('!{currentUser}')

并且在我的应用程序文件中(此处为咖啡脚本)

window.App = Ember.Application.create

  currentUser: null

  initConfiguration: (currentUser) ->
    if currentUser? and currentUser.length > 0
      @set 'currentUser', currentUser

如果您使用的是 ember-data,则必须将应用程序文件更改为

window.App = Ember.Application.create

  currentUser: null

  tempCurrentUser: null

  initConfiguration: (currentUser) ->
    ##
    # set the tempCurrentUser to the currentUser passed in, this is then
    # set in the ApplicationRoute to the App.currentUser
    # and destroyed (this is necessary as the ember store is not initialzed yet
    # and just setting it here will result in an error)     
    if currentUser? and currentUser.length > 0
      @set 'tempCurrentUser', currentUser

然后在您的应用程序路由中执行以下操作

App.ApplicationRoute = Ember.Route.extend

  setupController: (controller) ->
    if App.tempCurrentUser?
      App.setCurrentUser(App.tempCurrentUser)
于 2013-04-17T00:21:23.447 回答
0

Ember 有一个关于防止和重试身份验证的精彩指南:http: //emberjs.com/guides/routing/preventing-and-retrying-transitions/

根据用户是否登录进行转换的简单方法:

App.ApplicationRoute = Ember.Route.extend({
    willTransition: function () {
        var session = this.controllerFor('session');
        if (!session.get('authed')) {
            this.transitionTo('login');
        }
    }
});

上面的示例假设您有某种会话控制器或对象来管理活动会话。这是因为 ApplicationRoute 是您进入应用程序时(从任何 URL)进入的第一个路由。

于 2013-10-25T18:41:35.093 回答