【问题标题】:Angular OAuth2 Check for Privileges in GuardAngular OAuth2 检查 Guard 中的权限
【发布时间】:2020-12-15 21:22:37
【问题描述】:

在我的应用中,我只需要允许具有某些权限的用户查看某些“页面”。我认为最好的方法是创建一个 PrivilegeGuard。我目前有一个首先运行的 AuthGuard(我正在使用 https://www.npmjs.com/package/angular-oauth2-oidc),如果用户没有有效的身份验证令牌,它会返回 this.oauthService.loadDiscoveryDocumentAndLogin()。我需要解析令牌中的声明并在 PrivilegeGuard 中检查它们。我遇到的问题是 PrivilegeGuard 中的声明始终为空(因为它们尚未被解析)。我订阅了 app.component.ts 中的 oauth 事件并解析成功声明,但在此发生之前,守卫正在开火。

感觉像是 hack,但我尝试在 AuthGuard 中进行解析,但即使在用户登录后,this.oauthService.hasValidAccessToken() 仍然不正确,因为它仍然需要加载发现文档。

我尝试将 promise 转换为 observable 并在管道/映射中解析,但这似乎永远不会被调用。

return from(this.oauthService.loadDiscoveryDocumentAndLogin()).pipe(
      map((result) => {
        console.log('This is not called.');

        return result;
      })
    );

即使调用它,查看控制台,在 PrivilegeGuard 代码运行后发现调用完成。

有没有办法让 PrivilegeGuard 等待发现调用完成,以便我可以解析声明?

【问题讨论】:

    标签: angular oauth-2.0 angular-router-guards


    【解决方案1】:

    我最终使用了ReplaySubject,它在解析声明时设置了一个标志。然后我在 PrivilegeGuard 中订阅了它。 BehaviorSubject 不起作用,因为它有一个默认值,如果 PrivilegeGuard 会立即采用该值。 Subject 不起作用,因为它只在 canActivate 听到时发出标志,但 canActivateChild 只是坐着等待。使用ReplaySubjectcanActivateChild 能够获取最后一个发出的值。

    【讨论】:

      猜你喜欢
      • 2016-10-10
      • 2020-10-14
      • 1970-01-01
      • 2017-09-26
      • 2011-06-30
      • 2013-10-21
      • 2016-07-22
      • 2012-06-04
      • 1970-01-01
      相关资源
      最近更新 更多