New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
router canActivate not working with Observer or Promise response #9613
Comments
Observable.of(true) |
Your question sounds like a support request. Please use the issue tracker only for bugs and feature requests. Use gitter for support request. |
@vicb it's not support request, in the official doc api syntax: canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | boolean; then canActivate returns one of this results : Observable Or a boolean but with the first case Observable , it is not working |
I'm having the same problem. Here is my guard:
Browser console show I tried with I don't think btw, I use this firebase. (just for additional info) |
Same here with "@angular/core": "2.0.0-rc.2", "@angular/router": "^3.0.0-alpha.3", |
@darwin-gautalius
|
i juste done to test it with .take(1) it's work fine, |
thanks @Denhai. It really works as intended. |
Thanks for this. I guess angular2 just keeps waiting for it to finish. I also tried with .first(), instead of .take(1) and using observer.complete() after next and it worked as well. Not sure if there are better practices or problems with any of the approaches that one should know. |
The fact that the Observable needs to complete should be documented, this wasn't obvious to me either. |
I sent a PR fixing this issue. Take a look at #10412. |
Are there any plans to have a guard properly handle as an Observable? I have a problem that I need to wait for a login to happen before telling the guard true or false. If the user goes straight to a url defined as a route say "/admin" then when the canActivate() is called I don't have the user or its rights yet. So I have to default to false. When the login check is made (which is triggered automatically) and it comes back saying "yes, they have admin rights" I set the observable to true. But by then the router has determined that no it is not accessible so the router component does not show. The user then has to click on the link manually to get to the admin page. Since the canActivate() is now true it works, but annoying that I can't go straight to the admin page by typing in the url. |
@crowmagnumb
In your canActivate() function (or guard class method):
And then, once the security service determines if the user has admin privileges, it would set the value:
I'm doing something very similar, but in my case user information comes as part of page load from the server. So I have an initial value to provide, therefore I'm using BehaviorSubject instead of ReplaySubject with a capacity of 1. In a sense, these two are not very different, with the exception being that the former requires an initial value in the constructor, while the latter allows no value. |
@alobakov Just Perfect! |
@alobakov Thank you! I was using a |
It would be great if there was a way to have it work without requiring the observable to complete. Using a AsyncSubject or BehaviorSubject allows throttling of any Ajax requests made by calling canActivate. |
i have the same issue. app.route.ts. export const ROUTES: Routes = [ { authguard.ts import { Injectable } from '@angular/core'; above code should show "Canactivate Called" in console. but is not working. |
Inside AuthGuard I have the following
And somewhere into the router module you have
|
Add a take(1) to the pipe to complete the observable.
…On Fri, Apr 12, 2019, 09:49 Parautiu Razvan ***@***.***> wrote:
Inside AuthGuard I have the following
// Guard method
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> {
let token = localStorage.getItem("token");
let username = localStorage.getItem("username");
return this._authService.checkTokenAvailability().pipe(
map((response: Response) => {
// return Observable with true value and let the router and the guard to redirect you to dashboard in my case
return true
}),
catchError((err: Response) => {
// navigate to login page
this._router.navigateByUrl('/admin');
// handle the error by throwing statusText into the console
return throwError(err.statusText);
})
);
}
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#9613 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AAyu3dutWkMGJ6w9oKsEEJE4PfDHEMN8ks5vgDp_gaJpZM4I-ikg>
.
|
This issue has been automatically locked due to inactivity. Read more about our automatic conversation locking policy. This action has been performed automatically by a bot. |
router canActivate feature not work with Observable response but work with simple boolean response.
see this example :
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean>{ console.log('canActivate with AclService'); // if i return boolean, canActivate feature work // return true; // but if i return Observable, canActivate feature not work return Observable.create((observer:Subject<boolean>) => { observer.next(true); }); }
haw can i fix this problem ???
The text was updated successfully, but these errors were encountered: