Как вы загружаете данные асинхронно при загрузке углового модуля?
В моем угловом приложении мне нужно прочитать некоторые данные с сервера, прежде чем разрешить запуск остальной части моего приложения. Например, мне нужна аутентификация пользователя, чтобы я мог проверить его разрешение, прежде чем разрешить ему доступ ко всему. Поскольку мне нужно сделать это при запуске приложения, и я не знаю, какой контроллер будет загружен первым, я не могу использовать функцию разрешения метода $ routeProvider.when, потому что я не знаю, какой контроллер будет запущен первым, и это происходит только один раз при запуске приложения.
Я продолжаю делать что-то в методе module.run, но не могу найти способ предотвратить его продолжение, пока не получу данные с сервера. Я нашел это, но он страдает от той же проблемы: AngularJS: Инициализировать службу с асинхронными данными.
Я также могу выполнить ручную загрузку, но не могу найти хороших примеров того, как это сделать. Буду признателен за любую помощь, которую вы можете предоставить.
2 ответа
Как и другой ответ, уже упомянутый, вы должны позаботиться о безопасности вашего приложения.
Возможные решения:
Проверьте, аутентифицирован ли пользователь
Реализуйте аутентификацию в вашем API. Вы можете проверить, вошел ли пользователь с помощью responseInterceptor:
.config(['$routeProvider','$httpProvider', function($routeProvider,$httpProvider) {
//setup your routes here...
var authChecker = ['$location', '$q', function($location, $q) {
//redirects the user to /login page if he's not authorized (401)
function success(response) {
return response;
}
function error(response) {
if(response.status === 401) {
$location.path('/login');
return $q.reject(response);
}
else {
return $q.reject(response);
}
}
return function(promise) {
return promise.then(success, error);
}
}];
$httpProvider.responseInterceptors.push(authChecker);
}])
Смотрите $ http документы для более подробной информации.
Обходной путь: запустить область
Не решает проблемы безопасности, но тоже работает:
Получите ваши данные в блоке запуска следующим образом:
.run(function($http,$location,$rootScope) {
$rootScope.$on("$routeChangeStart", function (event, next, current) {
if($rootScope.gotData) {
$location.path(next.path);
} else {
$location.path('/loading');
}
});
$http.get('path/to/data').success(function() {
$rootScope.gotData = true;
$location.path('/home');
}).error(function() {
$location.path('/404');
})
})
см. документы для получения дополнительной информации.
Самый простой способ, которым я могу придумать, это создать отдельную страницу для входа. Как только пользователь аутентифицирован, разрешите ему только доступ к основному приложению (угловое приложение).
Также вам необходимо обезопасить свои сервисные ресурсы от несанкционированного запроса. Это защитит ваш контроллер от просмотра неавторизованных данных.