17

外部サービスによるルートの簡単な認証チェックを作成したいと考えています。

ルート オブジェクトでアクセス要件を定義します。

$routeProvider
    .when('/', {
        templateUrl: 'src/app/views/index.html',
        controller: 'indexCtrl',
        authenticated: true
    })
    .when('/login', {
        templateUrl: 'src/app/views/login.html',
        controller: 'loginCtrl',
        anonymous:  true
    })
    .otherwise({
        redirectTo: '/'
    })
;

次に、$routeChangeStartイベント内で許可があるかどうかを確認します。

$rootScope.$on('$routeChangeStart', function (event, next) {
    if(next.authenticated && !$myService.isLoggedin())
        $location.path("/login");
    else if(next.anonymous && $myService.isLoggedin())
        $location.path("/secured");
});

実際、それは機能します-
ユーザーが認証されていない場合はログインページに移動し、認証されているがルートが匿名ユーザーのみの場合は別のページに移動します.

しかし、このリダイレクトは、コントローラーとテンプレートがロードされた後に実際に発生します! また、認証されていない場合でも、コントローラーが REST API に対して不要な要求を行う原因となります。

彼らが処理する前にルートを処理するにはどうすればよいですか?

4

5 に答える 5

23

$routeProvider 解決を使用

.when('/', {
    templateUrl: 'src/app/views/index.html',
    controller: 'indexCtrl',
    resolve: function($q, $location) {
      var deferred = $q.defer(); 
      deferred.resolve();
      if (!isAuthenticated) {
         $location.path('/login');
      }

      return deferred.promise;
    }
})
于 2013-09-13T14:28:10.203 に答える