CanActivate охраны с помощью сервисного вызова
У меня есть требование в зависимости от роли, которую мне нужно активировать на маршруте. Пожалуйста, найдите код ниже:
canActivate(): boolean {
if(this.login_token) {
this._Service.getUser(this.login_token).subscribe(
(data) => {
if(data.role === 'admin') {
return true;
}
});
} else {
return false;
}
}
И я настроил свой маршрут, как показано ниже:
{path: 'user', children: childRoutes, canActivate: [AuthGuard]}
Но даже если мои охранники вернутся к истине, я все равно не смогу user
маршрут. Пожалуйста, дайте мне знать, если я делаю что-то не так здесь. Я уже исследовал множество постов на SO для обработки асинхронных вызовов в охранниках, но все еще безуспешно
1 ответ
Вы делаете http-вызов при каждом изменении маршрута?
Не.
Когда у вас есть токен в вашем интерфейсе, лучше либо
- Проверьте, является ли токен действительным
- Сделайте запрос и позвольте бэкенду декодировать токен.
Если вы будете выполнять http-вызов при каждом изменении маршрута, это не только замедлит работу вашего приложения, но и пользователям мобильных данных придется платить за эти вызовы, и им это не понравится.
Что вы должны сделать вместо этого:
canActivate(): boolean {
return this.login_token ? true : false;
}
Если ваш бэкэнд обрабатывает неправильные токены, или
canActivate(): boolean {
try {
return this.isTokenValid();
} catch(error) {
return false;
}
}
isTokenValid(): boolean {
// Test if token exists
// Decode token
// Check if token is not expired
// return a boolean stating if it succeed
}
Если ваш бэкэнд не обрабатывает токены (но так должно быть...)