So, I have a problem in a project with routing. I follow this steps.
- When Logon in system I save token and username in local storage.
- Login success, open dashboard page.
- I close browser and open again project. Page routing in Login page , no in dashboard page, only when I put correct url page routing ok. So data are in local storage. In this part I want to routing page in Dashboard page, not in login, only when I have data user in local storage. If local storage is empty I want to routing in Login Page
I have this routing:
const routes: Routes = [
{ path: 'login', component: LoginComponent },
{ path: 'forgotpassword', component: ForgotPasswordComponent },
{ path: '', component: LoginComponent },
{ path: 'panel', canActivate: [AuthGuard], loadChildren: () => import('./panel/panel.module').then(m => m.PanelModule) }
];
And this routing panel.
const routes: Routes = [
{
path: '',
component: PanelComponent,
canActivate: [AuthGuard],
canActivateChild: [AuthGuard],
children: [
{
path: '',
pathMatch: 'full',
redirectTo: 'dashboard'
},
{
path: 'dashboard',
component: DashboardComponent,
data: { allowedRoles: [Role.COMMUNITY_ADMIN] }
},
.....
{
path: 'documents',
component: DocumentComponent,
data: { allowedRoles: [Role.CHAIRMAN] }
},
]
}
];
I have and this Authguard.
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
if (this.authService.currentUserLogged){
return true;
}
this.router.navigateByUrl('/');
return false;
}
canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
if (this.authService.currentUserLogged) {
const userRoles = currentUserLogged.user?.user_roles;
const allowedRoles = route.data.allowedRoles;
return this.authService.isAuthorized(allowedRoles, userRoles);
}
this.router.navigateByUrl('/');
return false;
}
UPDATE
authservice.ts
currentUserLogged!: IUserLoggedInAccountDTO;
constructor(protected httpClient: HttpClient, private router: Router) {
this.currentUserLogged = this.getUserLoggedInAccount();
}
private getUserLoggedInAccount = (): IUserLoggedInAccountDTO => (JSON.parse(localStorage.getItem(environment.userLoggedInAccountLocalStorageKey) || '{}'));
isAuthorized(allowedRoles: any, userRoles: any): boolean {
if (allowedRoles === null || allowedRoles?.length === 0) {
return true;
}
if (userRoles !== null && userRoles?.length !== 0) {
const userRolesFiltered = userRoles.filter((userRole: any) => formatDate(userRole.end_date, 'yyyy-MM-dd', 'en_US') >= formatDate(new Date(), 'yyyy-MM-dd', 'en_US'));
const authorise: boolean = userRolesFiltered.some((userRole: any) => allowedRoles.includes(userRole.role.name));
if (!authorise) {
this.router.navigate(['/']);
return false;
}
return true;
}
return false;
}
Thank you so for your answer!
You have to redirect to Dashboard page when accessed to root page.
And you have to navigate to Login page when not logged in.
Update
You should navigate to
/login
before returnfalse
inauthservice.ts