2014-10-31 6 views
6

Ich versuche die Autorisierung für meine Winkelanwendung zu implementieren, wenn eine Route geändert wird Ich möchte überprüfen, ob die Route für den Benutzer autorisiert ist oder nicht. Ich habe versucht mit $routeChangeStart, aber es verhindert nicht das Ereignis.

Mein aktueller Code:

$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(); 
      } 
     } 
    }); 

Hier in meinem next Objekt ich route_object bin immer die in meinem $routeProvider

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

routes ist ein Objekt, das in meiner Funktion gebildet wird, festgelegt ist, aber wenn Ich verwende $locationChangeStart Ich erhalte nur URLs der nächsten und vorherigen Seite,

Wie bekomme ich die gesamte Route Objekt??

Antwort

13

Sie können die Routenparameter in einem $locationChangeStart Ereignis-Listener wie diese:.

$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(); 
     } 
    } 
}); 

Dann klassische prevent Methode, um die Arbeit tun würde. Hier ist eine plunker, die ich für etwas ähnliches geschrieben habe.

+0

Dies ist eigentlich für mich arbeiten, aber das Problem ist '$ location. $$ Pfad' returns '/ users' aber innerhalb meiner Route habe ich URL als '/ users /: id?' Aufgrund dessen bekomme ich einen Fehler. –

+0

Was ist der Fehler? –

+3

Dies funktioniert nicht. Wenn $ location.path den Wert/user/10 hat, kann die route/user /: id nicht gefunden werden. – r03

0

Was ist in der nächsten. $$ Route enthalten?

sollte es ein nächstes sein $$ route.route_object

+0

Innen '$ locationChangeStart'' next' nur eine Zeichenfolge ist. –

+2

Nein, verwenden Sie nicht $ locationChangeStart ... $ routeChangeStart ist, wo Sie sein möchten: '$ scope. $ On ('$ routeChangeStart', Funktion (Ereignis, nächste, aktuelle) { console.log (JSON.stringify (nächster $$ Route, null, 4.)); if (. current_user.is_logged_in) {var route_object = next $$ route.route_object;! if ((route_object.route_roles)) { Veranstaltung .preventDefault();} } }); ' –

+0

Yaa, das funktioniert, aber ich kann das Ereignis innerhalb' $ routeChangeStart' nicht verhindern –

0

Sie können auch $ Standortanbieter nutzen diese wie zu tun:

.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

Hallo und willkommen bei StackOverflow! Wie verbessert diese Antwort die bereits bestehende, akzeptierte Antwort? –

+0

Sie können die Qualität dieser Antwort verbessern, indem Sie eine Beschreibung hinzufügen, wie diese Antwort funktioniert und wie sie die Situation des Fragestellers verbessert. – toonice