angular - Angular OAuth2 检查 Guard 中的权限
问题描述
在我的应用程序中,我只需要允许具有某些权限的用户查看某些“页面”。我认为最好的方法是创建一个 PrivilegeGuard。我目前有一个首先运行的 AuthGuard(我正在使用https://www.npmjs.com/package/angular-oauth2-oidc),如果用户没有有效的身份验证令牌,它会返回this.oauthService.loadDiscoveryDocumentAndLogin()
. 我需要解析令牌中的声明并在 PrivilegeGuard 中检查它们。我遇到的问题是 PrivilegeGuard 中的声明始终为空(因为它们尚未被解析)。我订阅了 app.component.ts 中的 oauth 事件并解析了成功的声明,但在此之前警卫正在开火。
感觉就像是 hack,但我尝试在 AuthGuard 中进行解析,但即使在用户登录后,this.oauthService.hasValidAccessToken()
它仍然不是真的,因为它仍然需要加载发现文档。
我尝试将承诺转换为可观察的并在管道/地图中解析,但这似乎永远不会被调用。
return from(this.oauthService.loadDiscoveryDocumentAndLogin()).pipe(
map((result) => {
console.log('This is not called.');
return result;
})
);
即使它被调用,查看控制台,在 PrivilegeGuard 代码运行后发现调用完成。
PrivilegeGuard 有没有办法等待发现调用完成,以便我可以解析声明?
解决方案
我最终使用了ReplaySubject
在解析声明时设置了标志的 a。然后我在 PrivilegeGuard 中订阅了它。 BehaviorSubject
不起作用,因为它有一个默认值,如果 PrivilegeGuard 会立即采用该值。 Subject
没有用,因为它只是在canActivate
听到后才发出标志,但canActivateChild
只是坐着等待。使用ReplaySubject
,canActivateChild
能够获取最后一个发出的值。
推荐阅读
- javascript - 如何从嵌入在 MongoDB 对象数组中的数组中提取值?
- angular - Angular / Rxjs如何订阅具有不同参数的循环中的函数
- c++ - 释放 3 维向量 C++
- javascript - 将字符串值转换为 int (esp32)
- mysql - 使用一个接一个的值进行查询,为一堆值工作
- sql - 将每行中的值与列的平均值进行比较 (SQL)
- javascript - 从 QRCode 扫描时在输入值中添加逗号
- mysql - JPA - 使用特殊章程运行“插入”的 sql NativeQuery 失败
- c# - c# MySQL Connect I gоt a System.NullReferenceException Object reference not set an instance of an object
- mysql - 使用 WHERE 子句加入多个表,包括没有公共 ID 的行