Angular route async authorization

后端 未结 4 1690
一整个雨季
一整个雨季 2020-12-11 17:46

Angular doesn\'t provide any authorization/access permission on routing (I\'m talking default Angular route 1.x and not beta 2.0 or UI route). But I do have to implement it.

4条回答
  •  失恋的感觉
    2020-12-11 18:22

    If you can use ui-router, you could do this:

    .state('root', {
          url: '',
          abstract: true,
          templateUrl: 'some-template.html',
          resolve: {
            user: ['Auth', function (Auth) {
              return Auth.resolveUser();
            }]
          }
        })
    

    Auth.resolveUser() is just a backend call to load the current user. It returns a promise so the route will wait for that to load before changing.

    The route is abstract so other controllers must inherit from it in order to work and you have the added benefit that all child controllers have access to the current user via the resolve.

    Now you catch the $stateChangeStart event in app.run():

    $rootScope.$on('$stateChangeStart', function (event, next) {
            if (!Auth.signedIn()) { //this operates on the already loaded user
              //user not authenticated
              // all controllers need authentication unless otherwise specified
              if (!next.data || !next.data.anonymous) {
                event.preventDefault();
                $state.go('account.login');
              }
            }else{
             //authenticated 
             // next.data.roles - this is a custom property on a route.
             if(!Auth.hasRequiredRole(next.data.roles)){
                event.preventDefault();
                $state.go('account.my'); //or whatever
             }             
            }
          });
    

    Then a route that requires a role can look like this :

    .state('root.dashboard', {
             //it's a child of the *root* route
              url: '/dashboard',
              data: {
                 roles: ['manager', 'admin']
              }
              ...
            });
    

    Hope it makes sense.

提交回复
热议问题