Я использую Angular-Разрешение Библиотека вместе с UI-маршрутизатор и Satellizer .
Ниже приводится определение состояния для home
.В этом я проверяю, авторизован ли пользователь, используя angular-Разрешение .
$stateProvider.state('500', home);
var home = {
abstract: true,
url: '/home',
data: {
permissions: {
only: ['loggedin',],
redirectTo: {
loggedin: 'login',
},
}
},
templateUrl: 'components/home/home.view.html',
controller: 'HomeCtrl as home'
};
Ниже приведено определение разрешения для loggedin
PermPermissionStore.definePermission('loggedin', isAuthenticated);
function isAuthenticated(permissionName, transitionProperties) {
// check if token is valid.
if ($auth.isAuthenticated()) {
return true;
}
// if not then refresh token
return tokenRestService.refresh().then(
function (response) {
if (response != null) {
$auth.setToken(response);
}
},
function (response) {
localStorage.removeItem('user');
}
);
}
Но в некоторой степени это не работает, когда я выполняю асинхронный вызов.Если я изменю функцию isAuthenticated
следующим образом, то она будет работать правильно, но мне нужно обновить токен, если в случае истечения срока действия токена, в противном случае, перенаправить пользователя на страницу входа.
function isAuthenticated(permissionName, transitionProperties) {
if ($auth.isAuthenticated()) {
return true;
}
return false;
}
С doc angular-Разрешения:
Иногда вам нужно будет вызвать какой-то бэкэнд API или выполнить другую асинхронную задачу, чтобы проверить, действительно ли разрешение все еще действует.Для этого вы можете использовать обещания и просто вернуть их из функции проверки:
PermPermissionStore
// Define user permission calling back-end
.definePermission('hasValidSession', /*@ngInject*/function (Session) {
// Let's assume that Session service calls backend API via $http and return promise:
// -- $q.resolve() means that session is active
// -- $q.reject() means that session expired
return Session.checkSession();
});
Но когда я использую службу в definePermission
, она просто проходит без перенаправления.