我有
PermissionsService
存储用户的权限。这些是在用户成功验证过程后由HttpClient
从API加载的(登录后我调用加载用户权限组的getUserGroupsWithModelPermissions()
,然后我将这些权限汇总到_resolvedUserPermissions
BehaviorSubject)
在我需要这些用户权限的每个组件中,我订阅了
resolvedUserPermissions$
,在接收到数据后,我使用其他方法(例如resolveModelPermission()
,我从subscribe
传递数据)从ModelPermissionsService
做业务逻辑和它运作良好。
组件中的示例用法:
ngOnInit() {
this.$permissions = this.permissionsService.resolvedUserPermissions$.subscribe(data => {
this.canSeeProducts = this.permissionsService.resolveModelPermission(data, 'Products', PermissionScope.Read);
})
}
权限服务:
export class ModelPermissionService {
private _resolvedUserPermissions = new BehaviorSubject<ModelFieldPermissions[]>([]);
public resolvedUserPermissions$ = this._resolvedUserPermissions.asObservable();
public getUserGroupsWithModelPermissions(): void {
this.httpClient.get<ApiResponse<UserGroups[]>>(userEndpoint + '/me/permissions', httpOptions)
.subscribe({
next: data => {
this._resolvedUserPermissions.next(this.sumUserPermissions(data.data));
},
error: err => {
console.error(err);
}
})
}
public resolveModelPermission(userPermissions: ModelFieldPermissions[], modelName: string, permissionScope: PermissionScope):boolean {
if(userPermissions.length > 0){
// DO LOGIC HERE
}
return false;
}
}
现在我需要在router guard服务的canActivate方法中使用
resolvedUserPermissions$
的数据,但我不知道如何订阅这个resolvedUserPermissions$
?
我需要这样的东西:
canActivate(){
this.modelPermissionService.resolvedUserPermissions$.subscribe(data =>{
return this.modelPermissionService.resolveModelPermission(data, 'modelName', scope)
})
}
我找到的所有方法都使用 pipe+map 而不是订阅,但我没有权限数据。例子:
canActivate(){
return this.getAccess()
}
getAccess(){
this.permissionsService.resolvedUserPermissions$.pipe(
map(data =>{
//here data is empty, no logic to do, because no subscription?
})
)
}
你试过这个吗?
canActivate(){
return this.modelPermissionService.resolvedUserPermissions$.pipe(
switchMap(data => this.modelPermissionService.resolveModelPermission(data, 'modelName', scope))
)
}
许可服务:
export class ModelPermissionService {
getUserGroupsWithModelPermissions(): Observable<ModelFieldPermissions[]> {
this.httpClient.get<ApiResponse<UserGroups[]>>('yourpath', httpOptions)
.pipe(
map(data => this.sumUserPermissions(data.data)),
shareReplay(1), // probably you want to hold and re-use result from api
tap(data=> concole.log(data)), // DEBUGGING
);
}
resolveModelPermission(data, 'modelName', scope): Observable<boolean> {
return this.getUserGroupsWithModelPermissions().pipe(
map(data=> / your code to extract permission from user data /),
)
}
}
在解析器服务中:
canActivate() {
return this.modelPermissionService.resolveModelPermission(data, 'modelName', scope)
.pipe(
take(1), // Observable must complete!
tap(data=> concole.log(data)), // DEBUGGING
),
}