Я пытаюсь понять, как лучше всего проверить, аутентифицирован ли пользователь в приложении.
Сейчас я использую следующее:
- Пользователь входит в приложение
- На стороне сервера создается токен и отправляется обратно в браузер.
- При успешном входе в систему AngularJS сохраняет токен:
$http.defaults.headers.common['RequestVerificationToken'] = token || $cookies.token;
- При каждом HTTP-запросе на сервер отправляется Токен и проверяется на стороне сервера. В случае, если токен не существует, клиенту отправляется состояние ответа 401.
Это работает очень хорошо, теперь я использую UI-Router для управления состояниями приложения (страницы - реальный сценарий):
У меня следующее состояние:
$stateProvider
.state('personinfo', {
url: "/personinfo",
controller: 'PersonController',
templateUrl: "app/partials/personinfo.html"
})
Внутри моего PersonContoller:
app.controller('PersonController', function ($scope,$sce, $location, PersonService) {
$scope.title = 'Person Page';
PersonService.getPersons().success(function (response) {
$scope.persons = response.success;
}).error(function () {
// If token doesn't exist, a 401 reponse status is sent by server
$location.url('/login');
});
});
Мне не очень нравится, как это работает, потому что AngularJS загрузит состояние и загрузит частичный HTML-файл, а затем перейдет в контроллер и выполнит метод get, и если токен недействителен, то он будет перенаправлен на состояние входа.
Я хотел бы проверить токен перед загрузкой состояния, поэтому, если токен недействителен, частичный HTML не будет загружен или что-то еще.
Я читал, что UI-Router имеет свойство разрешения, которое можно использовать для получения данных до загрузки представления... могу ли я использовать разрешение для проверки токена?
Надеюсь, кто-то может дать мне руководство или совет.
Большое спасибо.