2015-03-03 12 views
5

Ich bin mir bewusst, dass diese Frage mehrmals diskutiert wurde, aber die Lösungen nicht in meine Anforderung passen. Die Suche ist einfach. Wenn der Benutzer nicht angemeldet ist, sollte der Benutzer zur Anmeldeseite umgeleitet werden. Wenn ich es in $ on mache, erzeugt es eine Endlosschleife. Lass mich wissen, was die beste Lösung ist.angularjs UI-Router erzeugt Endlosschleife

var adminpanel = angular.module('administrator', ['ngMessages','ui.router','ui.bootstrap','ngCookies']); 
    adminpanel.config(function ($stateProvider, $urlRouterProvider) { 
    // $urlRouterProvider.otherwise("/login"); 
     $urlRouterProvider.otherwise(function($injector, $location) { 
       var $state = $injector.get("$state"); 
       $state.go("login"); 
      }); 
       $stateProvider 
       .state('login', { 
           url: "/login", 
           controller:"userCtrl", 
           templateUrl: "views/login.tpl.html", 
           permissions:{except:['admin']} 
           } 
        ) 
        .state('menu', { 
           templateUrl: "views/menu.tpl.html", 
           controller:'adminCtrl', 
           permissions:{allow : ['admin']} 
           } 
        ) 
        .state('menu.dashboard', { 
           url: "/dashboard", 
           templateUrl: "views/dashboard.tpl.html", 
           permissions:{allow : ['admin']} 
           } 
        ) 

}); 


adminpanel.run([ '$rootScope', '$state', '$stateParams','$cookieStore',function ($rootScope, $state, $stateParams,$cookieStore) { 
$rootScope.$state = $state; 
    $rootScope.$stateParams = $stateParams; 
     $rootScope.$on('$stateChangeStart',function(event, toState, fromState){ 

      if($rootScope.session == undefined && $cookieStore.get('name') == undefined){$rootScope.session={}} 
      else if($rootScope.session == undefined && $cookieStore.get('name') != undefined){ 
        $rootScope.session={set:true, name : $cookieStore.get('name'), userid :$cookieStore.get('userid'), role:$cookieStore.get('role')}; 
      }; 
     //Added below lines as update  
      if(toState.name === "login"){ 
       return; 
      } 
     //Added above lines as update 
     var authorized = true; 
     if(Object.keys($rootScope.session).length === 0){ 
       event.preventDefault(); 
      $state.go('login'); 
     } 
     else if(Object.keys(toState.permissions).length !=0){ 
        console.log($rootScope.session.role); 
        angular.forEach(toState.permissions, function(value,key){ 
        angular.forEach(value,function(role){ 
         if(key === 'except' && role === $rootScope.session.role) 
         {authorized = false;} 
         else if(key === 'allow' && role !== $rootScope.session.role) 
         {authorized = false;}; 
        }); 
       }); 
} 
if(!authorized){ 
         event.preventDefault(); 
         $state.go('menu.dashboard'); 
       }; 

     }); 

}]); 

Vielen Dank im Voraus für Hilfe.

Update 1:

Die Lösung funktioniert gut. Wenn der Benutzer jedoch angemeldet ist, darf der Benutzer nicht auf die Anmeldeseite zugreifen, wenn er versucht, sie über die Adressleiste zu erreichen. Also habe ich einen Berechtigungsparameter mit Ausnahmeschlüssel erstellt.

Aber wenn der Benutzer Login-Seite über die Adressleiste erreicht, wird die Anmeldeseite generiert, die nicht sollte und es sollte zu menu.dashboard umgeleitet werden.

Hoffe ich bin klar.

Antwort

4

Der Punkt hier ist die Umleitung zu vermeiden, wenn es bereits passiert, wenn bereits umgeleitet:

... 
// never redirect to state, if already going there 
if(toState.name === "login"){ 
    return; 
} 

// evaluate some IF here only if we go to other state then login 
if(Object.keys($rootScope.session).length === 0) { 
    event.preventDefault(); 
    $state.go('login'); 
    return; 

} 
+0

Vielen Dank mein Freund. Ich habe es für mehr als 6 Stunden geschlagen. – alaksandarjesus

+0

Großartig wenn das irgendwie geholfen hat;) Genialer UI-Router;) –

+0

Ich habe gerade ein Update gemacht. Kannst du dir @Radim Kohler ansehen? Aber wenn der Benutzer die Login-Seite über die Adressleiste erreicht, wird die Login-Seite generiert, was nicht der Fall sein sollte. Er sollte auf menu.dashboard umgeleitet werden. – alaksandarjesus

2

die, wenn Schleife geändert und es funktionierte wie gewünscht. Unten ist der Arbeitscode.

if(Object.keys($rootScope.session).length === 0){ 
      if(toState.name === "login"){ 
       return; 
      } 
      else{ 
       event.preventDefault(); 
      $state.go('login'); 
      } 
     } 
     else if(Object.keys(toState.permissions).length !=0){ 

        angular.forEach(toState.permissions, function(value,key){ 
        angular.forEach(value,function(role){ 
         if(key === 'except' && role === $rootScope.session.role) 
         {authorized = false;} 
         else if(key === 'allow' && role !== $rootScope.session.role) 
         {authorized = false;}; 
        }); 
       }); 
      }; 
     if(!authorized){ 
        event.preventDefault(); 
        $state.go('menu.dashboard'); 
      }; 
+0

ein ausgezeichneter Job! Großartig, wirklich :) –