2014-10-31 10 views
6

Sto cercando di implementare l'Autorizzazione sulla mia applicazione angolare, quando si modifica un percorso, voglio verificare se il percorso è autorizzato per l'utente o meno. Ho provato con $routeChangeStart ma non impedisce l'evento.

mio codice corrente:

$scope.$on('$routeChangeStart', function(event, next, current) { 
     if(current_user.is_logged_in){ 
      var route_object = next.route_object; 
      if(!(route_object.route_roles)){ 
       event.preventDefault(); 
      } 
     } 
    }); 

Qui nel mio next oggetto sto ottenendo route_object che si trova nel mio $routeProvider

var routes = object; 
    app.config(function($routeProvider) { 
       $routeProvider.when(url, { 
        templateUrl: "/users.html", 
        route_object: routes, 
        }); 
      }); 

routes è un oggetto che si forma nella mia funzione, ma quando Io uso $locationChangeStart Sto solo ricevendo l'url della pagina successiva e precedente,

Come ottengo l'intero percorso opporsi ??

risposta

13

È possibile ottenere il parametro di percorso in un listener $locationChangeStart evento come questo:.

$scope.$on('$locationChangeStart', function(event, next, current) { 
    if(current_user.is_logged_in){ 
     var route_object = ($route.routes[$location.path()]).route_object; //This is how you get it 
     if(!(route_object.route_roles)){ 
      event.preventDefault(); 
     } 
    } 
}); 

metodo preventDefault Poi classico farebbe il lavoro. Ecco uno plunker che ho scritto per qualcosa di simile.

+0

Questo in realtà funziona per me ma il problema è '$ posizione. $$ percorso' restituisce'/users' ma all'interno del mio percorso ho URL come '/ users /: id?' A causa del quale sto ricevendo un errore. –

+0

Qual è l'errore? –

+3

Questo non funziona. Se $ location.path è/user/10, non è possibile trovare route/user /: id. – r03

0

Cosa è contenuto nel percorso successivo. $$?

Ci dovrebbe essere un prossimo $$ route.route_object

+0

All'interno '$ locationChangeStart'' next' è solo una stringa. –

+2

No, non utilizzare $ locationChangeStart ... $ routeChangeStart è dove si vuole essere:. '$ portata $ su ('$ routeChangeStart', la funzione (evento, il prossimo, corrente) { console.log (JSON.stringify (accanto $$ percorso, null, 4.)); se (. current_user.is_logged_in) {var route_object = prossimo $$ route.route_object;! if (()) {route_object.route_roles evento .preventDefault(); } } }); ' –

+0

Yaa che funziona, ma non riesco a impedire l'evento all'interno di' $ routeChangeStart' –

0

È inoltre possibile utilizzare $ fornitore di posizione per fare questo tipo:

.run(['$rootScope','$location',function($rootScope,$location){ 
     $rootScope.$on('$routeChangeStart', function(event,next, current) { 
     console.log('next',next); 
     console.log('location',$location.path()); 
     console.log('location',$location.search()); // for route params 
    }); 
    }])` 
1
$routeProvider 
     .when('/', { 
      title: 'Home', 
      templateUrl: 'partials/home', 
      controller: 'HomeController', 
      access: { 
       isFree: true 
      } 
     }) 
     .when('/about-us', { 
      title: 'About us', 
      templateUrl: 'partials/aboutus', 
      controller: 'AboutUsController', 
      access: { 
       isFree: true 
      } 
     }) 
     .when('/how-it-works', { 
      title: 'How It Works', 
      templateUrl: 'partials/howitworks', 
      controller: 'HowItWorksController', 
      access: { 
       isFree: true 
      } 
     }) 
     .when('/login', { 
      templateUrl: 'users/login', 
      controller: 'LoginController', 
      access: { 
       isFree: true 
      } 
     }) 
     .when('/logout', { 
      controller: 'LogoutController', 
      access: { 
       isFree: false 
      } 
     }) 
     .when('/sign-up', { 
      templateUrl: 'users/signup', 
      controller: 'SignUpController', 
      access: { 
       isFree: true 
      } 
     }) 
     .otherwise({ 
      redirectTo: '/' 
     }); 
}) 


.run(['$rootScope', '$location','$log','$window','Auth' ,function($rootScope, $location, $log, $window, Auth) { 

    $rootScope.$on('$routeChangeStart', function(event, currRoute, prevRoute){ 
     $rootScope.title = ''; 
     if(currRoute.$$route.title !== undefined){ 
      $rootScope.title = currRoute.$$route.title ; 
     } 
     // $rootScope.userLoggedIn = {name : 'Hi, '+ 'Amar'}  

     let checkIsLoggedInForRoute = ['/login','/sign-up']; 
     let isFreeAccess = currRoute.$$route.access.isFree; 
     let isLoggedIn = Auth.isLogin(); 

     if(isFreeAccess){ 
      if(checkIsLoggedInForRoute.indexOf($location.path()) !== -1 && isLoggedIn){ 
       event.preventDefault(); 
       $location.path('/') 
      } 
     }else if(!isFreeAccess){ 
      let isLogoutRoute = currRoute.$$route.originalPath.indexOf('/logout') !== -1; 
      if(isLogoutRoute && isLoggedIn){ 
       Auth.logout();   
       $location.path('/');  
      }else if(isLogoutRoute && !isLoggedIn){ 
       $location.path('/login'); 
      } 
     } 
    }); 
}]); 
+0

Ciao e benvenuto su StackOverflow! In che modo questa risposta migliora la risposta già esistente e accettata? –

+0

Puoi migliorare la qualità di questa risposta aggiungendo una descrizione di come funziona questa risposta e quindi come migliora la situazione del Questionario. – toonice