2016-09-13 15 views
5

Uaktualniam do [email protected] i próbuję ustalić, jaki jest najlepszy sposób przekierowania użytkownika do innego stanu, jeśli nie ma on wymaganych uprawnień.Przekierowanie UI-Router 1.0 oparte na roli użytkownika

To jest to, co mam:

.state('company_dashboard', { 
    url: '/dashboard', 
    templateUrl: 'dashboard.html', 
    controller: 'CompanyDashboardCtrl', 
    resolve: { 
     user: function(UserService) { 
      return UserService.getActiveUser(); 
     }, 
     company: function(UserService) { 
      return CompanyService.getActiveCompany(); 
     }, 
     permissions: function(CompanyService, user, company){ 
      return CompanyService.getUserPermissions(company, user); 
     } 
    }, 
    onEnter: function($state, permissions) { 
     if (permissions.canAccessDashboard === false) 
      return $state.go('company_landing_page'); 
    } 
}) 

Powyższy przykład działa, ale rejestruje się następujący błąd: TransitionRejection(type: 2, message: The transition has been superseded by a different transition, detail: Transition#1(''{} -> 'company_landing_page'{})) który sprawia, że ​​myślę, że powinien być lepszy sposób.

Pytanie boczne, czy dobrą praktyką jest sprawdzanie uprawnień podczas resolve?

UPDATE:

Zmiana $state.go() do $state.target() pomógł mi pozbyć się błędów konsoli. This comment pomógł. Chociaż pytanie jest ważne, czy robię to we właściwym miejscu?

+0

Kiedyś sprawdzałem pozwolenie na szablonie zbudowanym przez wiosnę lub ramkę backendu, myślę, że sprawdzanie uprawnień na interfejsie nie jest dobre, ponieważ każdy może zobaczyć kod. –

Odpowiedz

1

chciałbym dodać obiekt danych do stanu następująco:

.state('company_dashboard', { 
    data: { 
      requiresAuthentication: true 
    } 
} 

A potem:

app.run(function ($rootScope, $state) { 
    $rootScope.$on('$stateChangeStart', function (event, toState, toParams) { 
     // Check if user is authenticated 
     // And route requires authentication 
     if (!toState.data.requiresAuthentication) { 
      $state.go(toState.name, toParams); 
     } else if (user && toState.data.requiresAuthentication) { 
      $state.go(toState.name, toParams); 
     } else { 
      $state.go('login'); 
     } 
    }); 
}); 

Wydaje się to całkiem dobrze działać, nawet jeśli jestem pewien, może to być bardziej dopracowany, ale mam nadzieję, że da ci to pojęcie, jak możesz postępować.