2016-12-07 5 views
0

Hallo Ich stelle Sicherheit in meiner app eckig, ist, dass der Benutzer keine Route der Verwaltung zugreifen können nicht angemeldet ist, in diesem Fall habe ich diesen Code haben:Routen Permission in AngularJS

app.run(function($rootScope, $location, loginService){ 
    var routespermission=['/admin','/products','/products/','/products/:id/edit','/productos/:id/delete']; //route that require login 
    $rootScope.$on('$routeChangeStart', function(){ 
     if(routespermission.indexOf($location.path()) !=-1) 
     { 
      var connected=loginService.islogged(); 
      connected.then(function(msg){ 
       if(!msg.data) $location.path('/login'); 
      }); 
     } 
    }); 
}); 

der ersten Routen funktioniert gut, aber bei der Verwendung von URLs mit Format "Produkte/1/bearbeiten" werden dem Benutzer nicht protokolliert angezeigt, scheint es, dass etwas in diesem Teil fehlt, so dass der Benutzer Datensätze nicht bearbeiten und löschen kann

+1

'$ location.path' wird den * realen * Pfad (d. H.'/Products/someuserid/edit') zurückgeben, der nicht in Ihrem Array sein wird. – Claies

Antwort

0

ich bin kein Sicherheitsexperte, aber ich mache folgendes in meiner App. Ich gebe eine Berechtigung für die Route selbst und während des Laufs verwende ich einen Dienst, der die Berechtigungen meines aktuellen Benutzers enthält, und überprüfe, ob der Benutzer die erforderliche Berechtigung enthält.

$rootScope.$on('$routeChangeStart', function (event, next, current) { 
     if (next.permission !== undefined && next.permission !== null) { 
      if (!permissionStore.hasPermission(next.permission)) { 
       $location.path('/'); 
      } 
     } 
    }); 

Auf der Strecke selbst:

$routeProvider 
     .when('/SomeRoute', 
    { 
     templateUrl: 'something.html', 
     controller: 'SomeController', 
     controllerAs: 'vm', 
     permission: 'Some Permission' 
    }); 

Also, wenn der Benutzer nicht über ‚eine Berechtigung‘ es wird sie umleiten. Hoffe das hilft.

0

Sie können etwas ähnliches mit dem UI-Router tun. Im Folgenden habe ich Zustände als Beispiel und Funktion definiert, um Routen basierend auf Bedingung zu blockieren. Ich mache folgendes in meiner App.

.state('products', { 
       url: '/products', 
       views: { 
        '[email protected]': { 
         templateUrl: 'app/views/products/product.html', 
         controller: 'productController', 
         controllerAs: 'vm' 
        } 
       } 
      }) 

    .state('products_os', { 
       url: '/products', 
       views: { 
        '[email protected]': { 
         templateUrl: 'app/views/products/product_os.html', 
         controller: 'productOsController', 
         controllerAs: 'vm' 
        } 
       } 
      })  

$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { 

        var restrictedRoute: ['admin', 'products','product_os']; 

        angular.forEach($http.pendingRequests, function(request) { 
         request.canceler.resolve(); 
        }); 

        if (toState.name === "login" && authenticationService.IsAuthenticated() === true) { 
         return $state.go('products');   
        } else { 
         authenticationService.clearCredentials(); 
         $state.go('login'); 
        } 

        if ($.inArray(fromState.name, restrictedRoutes) === -1) return; 
     }); 

Hoffnung, dies hilft Ihnen. Danke