Home > database >  How to use same route guard for different routes that differ in authorization logic
How to use same route guard for different routes that differ in authorization logic

Time:03-19

For my Angular 6 project, I have one canactivate AuthGuard to load ComponentA.

I want to know can I use the same AuthGuard for component B where it's the authorization logic is exactly opposite to component A?

Let's say the logic to authorize component A as follows

  • Get summary items from API service HTTP GET call
  • Iterate on the items and check the activationStatus. If activation status is 'ACTIVE' return true
  • If no summary items are returned and activation status is not 'ACTIVE', return false and just show the login page.

My requirement is load component B is exactly opposite to above.

  • Show component B If no summary items are returned and activation status is not 'ACTIVE', do not load the component and just show the login page
  • If summary items are present and activation status is 'ACTIVE' just show login page.

Existing auth.guard.ts for component A:

export class AuthGuard implements CanActivate {
 
canActivate(next: ActivatedRouteSnapshot,state: RouterStateSnapshot): Observable<boolean>
{
    return this.checkAuthorization();
}
checkAuthorization():Observable<boolean>{

    let hasActiveSummary:boolean=false;

    return this.apiService.getSummary(url)
    .pipe(
      map((data:any) => {
        console.log("Summary list:", data);
          if(data.length > 0){
            for (let i=0; i< data.length; i  ) {
              if(data[i].activationStatus ==='ACTIVE') {
                hasActiveSummary=true;
                return true;
              }
            }
          }
          if(!hasActiveSummary){
            this.router.navigate(['/login']);
            return false;
          }
      })
    )
}

I would like to know can I use the same auth guard? If so, how to do it?

CodePudding user response:

canActivate method has state property which is of type RouterStateSnapshot. You can make a decision based on state.url and just return the inverse of hasActiveSummary based on the route you are reaching.

  • Related