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
}

Если ваш бэкэнд не обрабатывает токены (но так должно быть...)

Другие вопросы по тегам