Angular OAuth2 检查防护中的特权



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

感觉像是黑客,但我尝试在 AuthGuard 中解析,但即使在用户登录后,this.oauthService.hasValidAccessToken()还不是真的,因为它仍然必须加载发现文档。

我尝试将承诺转换为可观察的并在管道/映射中进行解析,但这似乎从未被调用过。

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

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

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

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

最新更新