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」の場合、管理ルートは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 に答える