У меня возникла проблема с моим механизмом аутентификации. Я должен вызвать API для получения текущих ролей пользователей, а затем проверить его, чтобы решить, что пользователь может просматривать страницы моего приложения. Моя идея: вызов API в myApp.run блоке, а затем проверить:AngularJS: проверить роль пользователя, чтобы решить, есть ли у пользователя разрешение на просмотр страниц или нет.
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 $ на (». $ routeChangeStart ') выполняется и всегда перенаправляет пользователя на страницу панели мониторинга. Что мне делать? У вас есть идеи/решения для решения этой проблемы? или Как ждать ответа от сервера, а затем запустить контроллер UserCtrl (когда пользователь переходит к/пользователю, UserCtrl будет выполняться без checkRole, потому что ответ не получен).
EDIT
То, что я действительно хочу сделать это, когда пользователь переходит на mySite.com, я буду называть API, чтобы получить роли пользователей. Запрос все еще продолжается, но каким-то образом пользователь переходит к mySite.com/#/user, страница пользователя отображается в Интернете сразу (Требование: пользователь не может видеть страницу пользователя до завершения запроса). По завершении запроса пользователь будет перенаправлен на mySite.com/#/dashboard, если у пользователя нет разрешения.
РЕШЕНИЕ
Я показать экран загрузки, чтобы блокировать мое приложение, пока запрос закончен. Спасибо за помощь.
использование $ д: https://docs.angularjs.org/api/ng/service/$q – MoLow
возможно дубликат [Как дождаться ответа приходит из запроса $ http, в angularjs?] (http://stackoverflow.com/questions/18421830/how-to-wait-till-the-response-comes-from-the-http-request-in-angularjs) –
@MoLow: Как я могу использовать $ q для своей проблемы? Например: пользовательский тип адреса mysite.com/#/user, угловая переместится на страницу пользователя (user.html), а контроллер UserCtrl будет выполнен. –