I have PermissionsService
which stores user's permissions. These are loaded from API by HttpClient
after user's successful auth process (after login I call the getUserGroupsWithModelPermissions()
which loads user's permission groups, and then I sum these permissions into _resolvedUserPermissions
BehaviorSubject)
In every component I need these user's permissions, I subscribe to resolvedUserPermissions$
, and after receiving data, I use other methods (ex. resolveModelPermission()
where I pass data from subscribe
) from ModelPermissionsService
to do business logic and it works well.
Example usage in components:
ngOnInit() {
this.$permissions = this.permissionsService.resolvedUserPermissions$.subscribe(data => {
this.canSeeProducts = this.permissionsService.resolveModelPermission(data, 'Products', PermissionScope.Read);
})
}
Permissions Service:
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;
}
}
Now I need to use data from resolvedUserPermissions$
in canActivate method in router guard service but I don't know how to subscribe to this resolvedUserPermissions$
?
I need something like this:
canActivate(){
this.modelPermissionService.resolvedUserPermissions$.subscribe(data =>{
return this.modelPermissionService.resolveModelPermission(data, 'modelName', scope)
})
}
All methods I found used pipe+map instead of subscribe but I had no permissions data. Example:
canActivate(){
return this.getAccess()
}
getAccess(){
this.permissionsService.resolvedUserPermissions$.pipe(
map(data =>{
//here data is empty, no logic to do, because no subscription?
})
)
}