AngularJS:检查用户角色以确定用户是否有权查看页面

时间:2015-05-12 11:05:08

标签: angularjs

我的身份验证机制有问题。我必须调用API来获取当前用户角色,然后检查它以确定用户可以查看我的应用程序的哪些页面。我的想法:在myApp.run块中调用API,然后检查:

angular.module('MyApp')
.run(['$rootScope', 'authenService', '$location', function($rootScope, authenService, $location) {
    var currentUser;

    function checkRole() {
      if(angular.isDefined(currentUser) && angular.isObject(currentUser) && ... && currentUser.isAdmin && $location.url() === '/dashboard') {
        return true;
      }
      return false;
    }
    /*
    ** @name: getCurrentUser
    ** @description: get current user info, use promise $q
    */
    authenService.getCurrentUser()
     .then(function getSuccess(currentUserInfo){
       currentUser = currentUserInfo;
       //if user is not admin and current page is not dashboard page, redirect to dashboard page
       if(!checkRole()) {
         $location.path('/dashboard');
       }
      }, function getError(){});

    //when user go to new path, check role if user have permission to access new page or not
    $rootScope.$on('$routeChangeStart', function onRouteChange() {
       if(!checkRole()) {
         $location.path('/dashboard');
       }
    })
}];

我的问题:当getCurrentUser API正在进行时(仍然没有收到服务器的响应),代码$ rootScope。$ on('$ routeChangeStart')被执行,并始终将用户重定向到仪表板页面。 我该怎么办?你有任何想法/解决方案来解决这个问题吗?或者我如何等​​待来自服务器的响应然后运行UserCtrl控制器(当用户转到/ user时,UserCtrl将在没有checkRole的情况下执行,因为尚未收到响应)。

  

修改

我真正想做的事情是当用户访问mySite.com时,我会调用API来获取用户角色。请求仍在进行中,但用户以某种方式访问​​mySite.com/#/user,用户页面立即在Web中显示(要求是用户在请求完成之前无法看到用户页面) 。请求完成后,如果用户没有权限,用户将被重定向到mySite.com/#/dashboard。

  

我显示加载屏幕以阻止我的应用,直到请求完成。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

尝试使用$ q服务:

angular.module('MyApp')
.run(['$rootScope', 'authenService', '$location', '$q', function($rootScope, authenService, $location, $q) {
    var currentUser;

    function checkRole() {
      var defered = $q.defer();
      if(angular.isDefined(currentUser) && angular.isObject(currentUser)){
         defered.resolve(currentUser.isAdmin && ($location.url() === '/dashboard')) 
      }else{
          authenService.getCurrentUser().then(function getSuccess(currentUserInfo){
              currentUser = currentUserInfo;
              defered.resolve(currentUser.isAdmin && ($location.url() === '/dashboard')) 
          });
      }
      return defered.promise;
    }

    $rootScope.$on('$routeChangeStart', function onRouteChange() {
       checkRole().then(function(isAdmin){
         if(isAdmin) $location.path('/dashboard');
       })
    })
}];