我有一个身份验证机制的问题。我需要调用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')代码被执行,并且总是将用户重定向到dashboard页面。我该怎么办?您有任何解决此问题的想法/解决方案吗?或者在等待服务器响应后如何运行UserCtrl控制器(当用户转到/user时,由于没有接收到响应,UserCtrl将不执行checkRole)。
编辑
我真正想做的事情是当用户转到mySite.com时,我会调用一个API来获取用户角色。请求仍在进行中,但某种方式用户转到了mySite.com/#/user,用户页面立即显示在web中(要求用户在请求完成之前不能看到用户页面)。请求完成后,如果用户没有权限,将重定向用户到mySite.com/#/dashboard。
解决方案
我展示加载屏幕以阻止我的应用程序直到请求完成。感谢您的帮助。