Итак, я пытаюсь сделать что-то простое:
- проверьте роль loggedUser на каждом маршруте (с разрешением, которое устанавливает пользователя, если токен или учетные данные для входа действительны на серверной части)
- перенаправить на предполагаемый маршрут
- если это не разрешено для маршрута, перенаправить на другой маршрут
В моем поставщике маршрутов у меня есть что-то вроде
$routeProvider
...
.when('/admin', {
templateUrl: 'views/admin/dashboard.html',
controller: 'AdminDashboardCtrl',
resolve: {
checkLoggedUser: check
}
})
...
где ckeck это функция
var check = function($rootScope, $q, AuthService) {
var deferred = $q.defer();
if($rootScope.loggedUser) {
return;
}
console.log('inside resolve check')
AuthService.check().success(function(data) {
$rootScope.loggedUser = data.user;
deferred.resolve(data.user);
});
console.log('finished check')
return deferred.promise;
};
И моя AuthService.check() - это эта функция
check: function()
{
var authtoken = StorageService.get('authtoken');
if(!authtoken) {
$location.path('login');
}
console.log('before returning');
return $http.post($rootScope.base + 'auth/authenticate', { 'authtoken': authtoken });
},
В моем .run(функция у меня есть
$rootScope.$on('$routeChangeSuccess', function() {
setIntendedUrl();
console.log($rootScope.loggedUser);
console.log($location.path());
});
и setIntendedUrl() проверяют loggedUser и перенаправляют на правильную страницу (или, в том, что я пытаюсь выполнить, перенаправляют на другую страницу, если это не разрешено, например, loggedUser имеет роль = 1, может посещать только маршруты / admin, если у пользователя есть роль = 2, а запрошенный путь /admin, его нужно перенаправить на /user)
Итак, после всего этого кода, когда приложение запускается, это мой журнал в консоли (см. В коде, где они вызываются)
inside resolve check app.js:29
before returning authservice.js:24
finished check app.js:36
intended: /admin/agents/create app.js:149 <--- here is where I redirect the user
Object {id: "21", name: "Kyle", surname: "Butler", roleId: "2"...} app.js:167
/admin/agents/create <--- requested path
Это не то, чего я ожидал, поэтому первые три журнала хороши, третий не ждет, когда обещание будет возвращено (поэтому у меня нет loggedUser), затем AuthService:check() возвращает пользователя, и это все сделано на данный момент, пользователь с ролью = 2 находится на маршруте, который не разрешен для просмотра.
Просто чтобы завершить код, это функция setIntendedUrl
var setIntendedUrl = function() {
intended = $location.path();
console.log('intended: ' + intended)
if(intended !== '/login') {
if($rootScope.loggedUser && $rootScope.loggedUser.roleId === '1' && !/^\/admin*/.test(intended)) {
intended = '/admin';
} else if($rootScope.loggedUser && $rootScope.loggedUser.roleId === '2' && !/^\/manager*/.test(intended)) {
intended = '/manager';
}
StorageService.set('intended', intended);
//$location.path(intended);
}
};
Что я делаю неправильно? Почему пользователь в функции проверки не разрешается до выполнения другого кода?