2016-10-14 9 views
4

問題は、すべての$ routeChangeStartにあります。ユーザーが見つからない場合は、URLを入力するだけで、まだ私をページに誘導します。角度認証

今、私はサーバー上のルールを書き直しました。

Options +FollowSymlinks 
RewriteEngine On 
# Don't rewrite files or directories 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule^- [L] 

RewriteRule (.*) /index.html [L] 

そしてここで、ここでapp.js

var app = angular.module('myApp', ['ngRoute']); 
app.config(function($httpProvider){ 


    // attach our Auth interceptor to the http requests 
    $httpProvider.interceptors.push('AuthInterceptor'); 


}); 


app.run(['$rootScope','$scope','Auth', '$location', function($rootScope, $scope, Auth, $location){ 
    $rootScope.$on('$routeChangeStart', function(event){ 
     $scope.loggedIn = Auth.isLoggedIn(); 
     console.log(Auth.isLoggedIn()); 

     Auth.getUser().then(function(response){ 
      console.log(response); 
      $scope.user = response; 
     }).catch(function(error){ 
      console.log(error); 
     }); 

    }); 
}]); 

そして、ある角度認証工場

app.factory('AuthToken', function($window){ 

    var authTokenFactory = {}; 

    authTokenFactory.setToken = function(token){ 
     if(token){ 
      $window.localStorage.setItem('token', token); 
     }else{ 
      $window.localStorage.removeItem('token'); 
     } 
    }; 

    authTokenFactory.getToken = function(){ 
     return $window.localStorage.getItem('token'); 
    } 

    return authTokenFactory; 
}); 


app.factory('Auth', function($http, $q, AuthToken, Passingtoken){ 

    var authFactory = {}; 

    authFactory.login = function(email, password){ 
     var data = { 
      email: email, 
      password: password 
     }; 

     return $http.post('/loginForm.php', JSON.stringify(data)).then(function(response){ 
      // console.log(response); 
      AuthToken.setToken(response.data); 
      return response; 
     }).catch(function(e){ 
      console.log(e); 
      return $q.reject(e.data); 
     }); 
    }; 


    authFactory.logout = function(){ 
     AuthToken.setToken(); 
    }; 

    authFactory.isLoggedIn = function(){ 
     if(AuthToken.getToken()){ 
      return true; 
     }else{ 
      return false; 
     } 
    }; 

    authFactory.getUser = function(){ 
     var defer = $q.defer(); 
     if(AuthToken.getToken()){ 
      var userdata = JSON.parse(Passingtoken.getUserData()); 
      userdata = userdata[0].data; 
      console.log(userdata); 

      /** 
      * get the token. Might make this a service that just gets me this token when needed. 
      */ 
      $http.post('/decode.php', { 
       userdata 
      }).then(function(response){ 
       console.log(response.data.rows[0]); 
       //$scope.username = response.data.rows[0].fullname; 
       defer.resolve(response.data.rows[0]); 
      }, function(e){ 
       console.log(e); 
      }); 
     }else{ 
      return $q.reject({ 
       message: 'User not found' 
      }); 
     } 
     return defer.promise; 
    }; 


    return authFactory; 
}); 


app.factory('AuthInterceptor', function($q, $location, AuthToken){ 

    var interceptorFactory = {}; 

    interceptorFactory.request = function(config){ 
     // grab a token 
     var token = AuthToken.getToken(); 
     // if token is there added to header 
     if(token){ 
      config.headers['x-access-token'] = token; 
     } 

     return config; 
    }; 

    interceptorFactory.responseError = function (response) { 

     if (response.status == 403){ 
      AuthToken.setToken(); 
      $location.path('/login'); 
     } 
     return $q.reject(response); 

    }; 


    return interceptorFactory; 
}); 

そして、ここでは私がルート変更のため

app.controller('mainCtrl', ['$scope', 'Passingtoken', '$http','$window', 'Auth', '$location', '$rootScope', function($scope, Passingtoken, $http, $window, Auth, $location, $rootScope){ 

    // check for loggin in 
    $scope.loggedIn = Auth.isLoggedIn(); 

    // rootscope 
    $rootScope.$on('$routeChangeStart', function(event){ 
     $scope.loggedIn = Auth.isLoggedIn(); 
     console.log(Auth.isLoggedIn()); 

     Auth.getUser().then(function(response){ 
      console.log(response); 
      $scope.user = response; 
     }).catch(function(error){ 

      console.log(error); 
     }); 

    }); 


    $scope.logged = function(){ 
     if($scope.loginData.email !== '' && $scope.loginData.password !== ''){ 
      Auth.login($scope.loginData.email, $scope.loginData.password).then(function(response){ 
       //console.log(response); 
       if(response.data !== 'failed'){ 
        Passingtoken.addData(response); 
        $location.path("/home"); 
        //$window.location.reload(); 
       }else{ 

       } 
      }, function(e){ 
       console.log(e); 
      }); 
     } 
    }; 



    /** 
    * Logout function 
    */ 
    $scope.logout = function(){ 
     Auth.logout(); 

     $scope.username = ""; 
     $location.path("/"); 
    } 

}]); 
をチェックしていますメインコントローラである私のものです

$ rootscopeにあります。私はユーザーがトークンを持っているかどうかをチェックしていますが、ユーザーがルートを変更できる場合(私はjwtを使用しています)、私がURLを通過すると、トークンを持っていなくてもどこでもかかります。私のmaincontrollerでは、.catch()に$ location.path( '/')を追加しようとすると、すべてのルート変更で、私がログインしていなくても、そのパスに私を連れて行って、ログインをクリックしようとすると、その道に行き、それは理にかなっている。私はちょうどユーザーがURLを介して入ることができないようにする方法を失っていると角度はすべての要求をチェックする必要があります。どんな助けでも大歓迎です。

ありがとうございました

+0

あなたは私がすべてで実行セクションを使用していない@Phil 'メインのアプリケーション・モジュールの' run'セクション – Phil

+0

に呼び出す(「$ routeChangeStart」)上のあなたの '$を移動する必要があります。 –

+0

私は何を言っているのですか? – Phil

答えて

0

このコード部分をアプリケーションの実行ブロックに移動してください。

$rootScope.$on('$routeChangeStart', function(event){ 
     $scope.loggedIn = Auth.isLoggedIn(); 
     console.log(Auth.isLoggedIn()); 

     Auth.getUser().then(function(response){ 
      console.log(response); 
      $scope.user = response; 
     }).catch(function(error){ 

      console.log(error); 
     }); 

    }); 
+0

それは動作しません。私はapp.jsに.runモジュールを追加しましたが、URLを通過するとまだページにアクセスできます –

関連する問題