I have used CanActivate
to protect a page but it always returning false because of that I can not access the protected router. I tried many ways, but was not successful to fix the issue. I am new to angular and I am stuck in validating the condition if (data.hasPermission == true).
Can any one please help me?
auth.service.ts
//Checking user access getUserAccess(name: string): Observable<any> { return this.http.get(`api/${name}/useraccess`).pipe( map( (response: any) => { return response; }, ), ); }; checkUserPermission() { this.getUserAccess(this.name).subscribe(data => { this.hasaccess = false; if (data.hasPermission == true) { this.hasaccess = true; } else { this.hasaccess = false; } }); return this.hasaccess } isUserHasAccess(): boolean { return this.hasaccess }
auth.guard.ts
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { if (this.authService.isUserHasAccess()) { return true; } else { return false; } }
{"hasPermission":true}
You're returning a static value, you're not waiting for the async task to complete.
Look closely at the docs, canActivate
can also return an Observable
that resolves to true
or false
, this allows you to do async checks.
Try this instead:
checkUserPermission() {
return this.getUserAccess(this.name).pipe(map(data => data.hasPermission === true))
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
return this.authService.checkUserPermission();
}
The Angular Router
will subscribe to that Observable
, you don't have to. All you have to do is map it to a function that returns a boolean.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.