可以通过服务调用激活守卫

CanActivate guard with service call

我有一个要求,我需要根据角色激活路由。请在下面找到代码:

  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]}

但即使我的守卫 return 为真,我仍然无法路由到 user 路由。 如果我在这里做错了什么,请告诉我。我已经探索了很多关于 SO 的帖子来处理警卫中的异步调用,但仍然没有成功

您在每次路由更改时都进行 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
}

如果您的后端不处理令牌(但它应该如此...)