2013-12-11 15 views
5

ログインしていないユーザーをログインルートにリダイレクトする方法をきちんと実装しようとしています。私の解決策を別のSO回答here箱から出ない。ここに私の解決策があります。私はルートをリダイレクトできるように、私は$routeChangeErrorイベントで聞くことができる場所ユーザーが認証されていない場合、ルートにリダイレクトする

angular.module('myApp', ['ngResource', 'ngRoute']) 
    .config(['$routeProvider', function ($routeProvider) { 
    var requireAuthentication = function() { 
     return { 
      load: function ($q) { 
       console.log('Can user access route?'); 
       if (g_isloggedIn === true) { // fire $routeChangeSuccess 
        var deferred = $q.defer(); 
        deferred.resolve(); 
        console.log('Yes they can!'); 
        return deferred.promise; 
       } else { // fire $routeChangeError 
        console.log('No they cant!'); 
        return $q.reject("'/login'"); 
       } 
      } 
     }; 
    }; 

    $routeProvider 
     .when('/some_page_that_requires_authentication', { 
      templateUrl: '/views/secret.html', 
      controller: 'secretCtrl', 
      resolve: requireAuthentication() 
     }) 
     .when('/anybody_can_see_me', { 
      templateUrl: '/views/public.html', 
      controller: 'publicCtrl', 
     }); 
}]); 

私の質問は、ありますか?私はディレクティブでそれをやってみましたが、イベントを起こすことは決してできませんでした。私はそれをコントローラに入れることはできません。なぜなら、約束が拒否されればロードされないからです。何かご意見は?

+0

あなたは 'ng-view'要素の外にあるコントローラ(または指令)でそれを見ることができます。 – Stewie

+1

でも 'run()'に置くことができます...あなたのコードにわずかなバグがあります... 'if'の前に' $ q.defer(); 'を呼び出す必要があります – charlietfl

答えて

0

あなたは、この問題のいくつかの助けを見つけるかもしれない:AngularJS: Understanding $rootScope.$on('$routeChangeSuccess

は、一般的に私は、認証を確保するための「決意」を使用すると、少し奇妙であることを感じるが、より良い方法がありません、私は、などいくつかのサービスを追加することを示唆していますその点以外は何か。

最後に、https://github.com/dotJEM/angular-routingのような他のルーティングソリューションでは、より高度な制御が可能です。

3

ユーザを機能内からリダイレクトするべきではない理由はありますか? これは私のためにうまくいく、約束が解決されていない場合、コントローラ/ビューをロードしません。

私はこのような機能を変更:

var requireAuthentication = function() { 
    return { 
     load: function ($q, $location) { 
      console.log('Can user access route?'); 
      var deferred = $q.defer(); 
      deferred.resolve(); 
      if (g_isloggedIn === true) { // fire $routeChangeSuccess 
       console.log('Yes they can!'); 
       return deferred.promise; 
      } else { // fire $routeChangeError 
       console.log('No they cant!'); 
       $location.path('/login'); 

       // I don't think this is still necessary: 
       return $q.reject("'/login'"); 
      } 
     } 
    }; 
}; 
+0

どこにこのコードを書くのですか? .config()ブロックの –

+0

は多分でしょうか?質問のように。または範囲のどこかに?ちょうどそれは利用可能です。 – wiherek

0

私はあなたがこの問題を過ぎてもだと確信しているが、今の答えをお探しの方のために、ここに私の2セントです。

あなたがここで紛失している唯一の事は、約束が拒否された場合に起こることです。あなたはHTTPの傍受でこれをしたいでしょう。 routeChangeErrorにリスナーを置き、そこでリダイレクトします。 https://docs.angularjs.org/api/ng/service/$http(インターセプタセクションまでスクロールダウン)

関連する問題