1

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

  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 的帖子来处理警卫中的异步调用,但仍然没有成功

4

1 回答 1

3

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

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

于 2018-01-24T09:51:22.807 回答