1

In my app you can find many routerLinks everywhere across the application. Some of them may not be accessible for some users according to their roles. My auth-guard-service handles this cases.

But what in those cases happens is that the user gets navigated to the forbidden page and then back to the old page.

What I want instead of this is not navigating at all but displaying a modal or toast message (what ever) on the current site.

How can this be done? Here's some of my code:

export class AuthGuardService implements CanActivate {
  constructor(public auth: AuthServiceProvider, public router: Router, private TokenHelper: TokenHelperService) {}

  canActivate(Route: ActivatedRouteSnapshot): Observable<boolean> {
    const expectedRoles = Route.data['authenticate'] as string[];

// ...... and so on (return true or false)


L. Heider
  • 1,579
  • 1
  • 14
  • 31

1 Answers1

4

If the forbidden page user tries to activate is in the lazy loaded module, you can prevent the navigation by putting canLoad guard.

{
  path: 'admin',
  loadChildren: () => import('./admin/admin.module').then(mod => mod.AdminModule),
  canLoad: [AuthGuard]
},

=====

    canLoad(route: Route): boolean {

      return this.checkValidation();
    }

   checkValidation() {
   if (authService.checkRights()) { return true}
   else {
   this.toastService.showToast('Forbiden');
   return false
   }
}

}
Nosheep
  • 493
  • 1
  • 4
  • 10