web-dev-qa-db-ja.com

locationChangeStartとルート変更の防止

ユーザーが何らかのルートにアクセスできるかどうかの基本的な検証を作成しようとしています。進歩はありましたが、理解できないことが1つあります。

$ locationChangeStartを使用してルートの変更を監視しています。シナリオは次のとおりです。1。ユーザーがログインしている場合、認証ルート(ログイン、登録)を除くすべてのルートへのアクセスをユーザーに許可します。 AuthFactory 2からメソッドisAuthenticated()を呼び出してこれを確認しています。ユーザーがログインしていない場合、ユーザーはログインルートと登録ルートにのみアクセスします。他のルートは防止する必要があり、その場合、ユーザーはログインにリダイレクトされる必要があります。

_$rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl){
  if(AuthFactory.isAuthenticated()){
    if(AuthFactory.isAuthRoute(newUrl)){
      event.preventDefault();
      $location.path('/');
    }
  } else {
    if(!AuthFactory.isAuthRoute(newUrl)){
      event.preventDefault();
      $location.path('/login');
    }

  }
});
_

私を悩ませているのは、preventDefault()を使用しているものです。アプリがpreventDefault()、その後に続くlocation.path()のコードに到達した場合、単に機能しません。

ただし、event.preventDefault()を削除すると、location.path()は機能します。これに関する問題は、ログに記録されていない人が認証以外のページにアクセスしようとした場合に備えて、それを防ぐ必要があることです。

基本的に、要求されたルートに基づいて防止またはリダイレクトできるようにしたいです。それを行う適切な方法は何ですか?

6
Ned

わかりました、これを行う必要があります:

var authPreventer = $rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl){
    if(AuthFactory.isAuthenticated()){
        if(AuthFactory.isAuthRoute(newUrl)){
            event.preventDefault();
            authPreventer(); //Stop listening for location changes
            $location.path('/');
        }
    } 
    else {
        if(!AuthFactory.isAuthRoute(newUrl)){
            event.preventDefault();
            authPreventer(); //Stop listening for location changes
            $location.path('/login');
        }
    }
});
4
saike

特定のルートへのアクセスを防ぐために、解決でauthを使用してみることができます。 ここ はドキュメントです。あまり明確ではありませんが、そこにはたくさんの例があります。

2
yotamsha

最近同じ問題が発生しましたが、_$routeChangeStart_の代わりに_$locationChangeStart_をリッスンすることで($route.reload()を呼び出す必要なしに)ようやく解決できました。

両方のイベントのドキュメントは少しあいまいです..._$ruteChangeStart_イベントは_$locationChangeStart_の前に呼び出されると思います(ここで何が起こっているのかを完全に理解するためにソースコードを読みます)。

0
rvignacio