我的身份验证机制有问题。我必须调用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。
解
我显示加载屏幕以阻止我的应用,直到请求完成。谢谢你的帮助。
答案 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');
})
})
}];