2017-01-23 5 views
0

Я хочу Угловое проверить подлинность при каждом изменении маршрута. Мой код выглядит так.Аутентификация при изменении маршрута

config.js

angular.module('message').run(['$rootScope', '$location', 'Auth', function ($rootScope, $location, Auth) { 
    $rootScope.$on('$routeChangeStart', function (event) { 

     if (!Auth.isLoggedIn()) { 
      console.log('DENY'); 
      event.preventDefault(); 
      $location.path('/Login'); 
     } 
     else { 
      console.log('ALLOW'); 
      $location.path('/home'); 
     } 
    }); 
}]); 

authenticationService.js

var app=angular.module('message'); 
app.factory('Auth', function($rootScope){ 


return{ 
    setUser : function(aUser){ 
     $rootScope.user = aUser; 
    }, 
    isLoggedIn : function(){ 
     return($rootScope.user)? $rootScope.user : false; 
    } 
    } 
}) 

мои app.js выглядит следующим образом

var app=angular.module('message',['restangular','ngRoute']); 


app.config(['$routeProvider', function ($routeProvider){ 
    $routeProvider 
    .when("/", { 
     templateUrl : "view/user.html", 
     controller : "loginController" 
    }) 
    .when("/NewUser", { 
     templateUrl : "view/addUser.html", 
     controller : "MainCtrl" 
    }) 
    .when("/ViewUsers", { 
     templateUrl : "view/ViewUsers.html", 
     controller : "MainCtrl" 
    }) 
    .when("/EditUser/:id", { 
     templateUrl : "view/EditUser.html", 
     controller : "MainCtrl" 
    }) 
    .when("/Register", { 
     templateUrl : "view/Register.html", 
     controller : "RegisterController" 
    }) 
    .when("/Login", { 
     templateUrl : "view/user.html", 
     controller : "loginController" 
    }) 
    .when("/Home", { 
     templateUrl : "view/Home.html", 
     controller : "HomeController" 
    }) 
    .when("/ForgotPassword", { 
     templateUrl : "view/Home.html", 
     controller : "ForgotController" 
    }); 

}]); 

app.controller('MainCtrl',function($scope,Restangular,$location,$routeParams,$http,Auth){ 
    Restangular.setBaseUrl('webapi'); 

    //watch to work on user state changed 
    $scope.$watch(Auth.isLoggedIn, function (value, oldValue) { 

      if(!value && oldValue) { 
       console.log("Disconnect"); 
       $location.path('/Login'); 
      } 

      if(value) { 
       console.log("Connect"); 
       //Do something when the user is connected 
       $location.path('/Home'); 
      } 

      }, true); 


    //setting profile name as id for profiles model 

    var index = $routeParams.id; 
    $scope.index=index; 
    console.log($scope.index) 
    var profiles = Restangular.all('profiles'); 

    Restangular.setRestangularFields({ 
      id: "_id" 
     }); 

    Restangular.extendModel('profile', function(profile) { 
      profile.id = profile.profileName; 
     }); 

    Restangular.addResponseInterceptor(function (data, operation, what, url, response, deferred) { 
     if (operation == "getList") { 
      return response.data; 
     } 
     return response+=response.data; 
    }); 

    data=function(user){ 
     consle.log(user); 
    } 


    // This will query /profiles and return a promise. 
    profiles.getList().then(function(profiles) { 
     $scope.profiles = profiles;  
     $scope.saveUser=function(){ 
      $scope.profile.profileName=$scope.profile.firstName+$scope.profile.lastName; 
      console.log($scope.profile); 
      profiles.post($scope.profile); 
    } 

     $scope.showUser=function(id){ 
      $location.path('/EditUser/'+id); 
     } 
     $scope.editUser=function(id){ 
      //put requestusing http 
      var probject={}; 
      probject.firstName=profiles[id].firstName; 
      probject.lastName=profiles[id].lastName; 
      probject.profileName=profiles[id].profileName; 
      probject.id=profiles[id].id; 
      probject.created=profiles[id].created; 
      $http.put("http://localhost:8080/messenger/webapi/profiles/"+$scope.profiles[id].profileName,probject).then(function(data){ 
      console.log(data); 
      }); 


     } 
    }); 




     $scope.go = function (path) { 
      $location.path(path); 
     }; 
}); 

проблемой я столкнулся мой код прекрасно работать без конфигурации .js , но всякий раз, когда я регистрирую событие $ onroutechange с помощью службы аутентификации, используя config.js мой код перестает работать без каких-либо ошибок.

Возможно, я делаю что-то глупое, поскольку я новичок в угловом. прошу помочь.

+1

Используйте разрешение на изменение маршрута. И используйте $ httpProvider.interceptors –

+0

вы можете объяснить дальше? – Naveen

+0

Что возвращает функция 'isLoggedIn()', если пользователь аутентифицирован? Строка 'if (! Auth.isLoggedIn())' должна возвращать либо true, либо false. Это происходит? – sisyphus

ответ

2

попробовать что-то вроде этого:

$rootScope.$on('$routeChangeStart', function (event, next) { 
    if (next.$$route.originalPath!=='/Login' && !Auth.isLoggedIn()) { 
    ... 

В противном случае вы получите в бесконечный цикл.

+0

Спасибо Shalom и @Manikandan Это сработало. – Naveen

Смежные вопросы