【问题标题】:CanActivate guard with service callCanActivate 带有服务调用的警卫
【发布时间】:2018-01-24 09:46:43
【问题描述】:

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

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

【问题讨论】:

  • 用户路由在没有 AuthGuard 的情况下工作?
  • @JavascriptHuppTechnologies 是

标签: angular angular-router-guards


【解决方案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
}

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

【讨论】:

  • 是的,同意!即使我不想在每次路线更改时都发送电话,但请查看我编辑的问题。我想检查角色是否为管理员。我们使用了未在令牌中设置角色的实现。所以请建议我该怎么做?
  • 您仍在进行 HTTP 调用以检查角色。您应该做的是将角色存储在令牌中,解码令牌,并在isTokenValid 函数中检查其中一个角色是否是管理员角色。
  • 好的,明白了。一件事是我不会从服务器获得令牌中的角色。因此,如果我在 JavaScript 中加密角色并将其存储在 LocalStorage 中,这不会是安全问题.. 因为任何人都可以操纵角色?
  • I wont be getting role in token from server,那么,将角色放入令牌中! 选择了要放入令牌的内容,所以好好利用它吧!是的,这将是一个安全问题,你不应该这样做!
  • 我正在使用 oauth2-server(npmjs.com/package/oauth2-server) 生成令牌,并且包生成的令牌不返回基于角色的令牌。我仍在探索它。是的,我同意你的看法。 :)
猜你喜欢
  • 2021-09-13
  • 2019-01-27
  • 2017-07-26
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
相关资源
最近更新 更多