Angular2: Prevent authenticated users from accessing specific routes

后端 未结 3 1333
礼貌的吻别
礼貌的吻别 2020-12-31 04:43

I\'ve defined some routes in my main.ts file:

const routes: RouterConfig = [
  { path: \'\', component: HomeComponent },
  { path:          


        
相关标签:
3条回答
  • 2020-12-31 05:05

    Make ts file name auth.guard.ts put following code on that

    Write guard code

    import { Injectable } from '@angular/core';
    import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
    
    @Injectable()
    export class AuthGuard implements CanActivate {
        constructor(private router: Router) { }
        canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
            if (localStorage.getItem('currentUser')) {
                // logged in so return true
                return true;
            }
            // not logged in so redirect to login page with the return url
            this.router.navigate(['/login'], { queryParams: { returnUrl: state.url }});
            return false;
        }
    }
    

    Add bellow code in your routing ts file

    app-routing.module.ts

    {
          path: 'user', component: UserComponent,canActivate: [AuthGuard] ,
          children: [{ path: 'home', component: HomeComponent },
                     { path: 'view/:id', component: UserViewComponent },
                     { path: 'add', component: UserAddComponent },
                     { path: 'edit/:id', component: UserAddComponent }
                    ]  
      },
    

    Add providers in your app.module.ts file

    app.module.ts

    @NgModule({
      declarations: [
        AppComponent
        --------
      ],
      imports: [
        BrowserModule
        --------
      ],
      providers: [      
        AuthGuard        
      ],
      bootstrap: [AppComponent]
    })
    
    0 讨论(0)
  • 2020-12-31 05:06

    You could write a guard like this:

    import { Injectable } from '@angular/core';
    import {
        ActivatedRouteSnapshot,
        CanActivate,
        RouterStateSnapshot
    } from '@angular/router';
    
    import { AuthService } from './your-auth.service';
    
    @Injectable()
    export class UserAccessGuard implements CanActivate {
        constructor(private authService: AuthService) {
        }
    
        canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
            return route.data['onlyGuests'] != authService.isAuthenticated();
        }
    }
    

    And then use it in your route definition:

    const routes: Routes = [
      { path: '', redirectTo: 'home' },
    
      // accessible only to guests
      {
          path: '',
          component: HomeComponent,
          data: { onlyGuests: true },
          canActivate: [ UserAccessGuard ]
      },
      {
          path: 'login',
          component: LoginComponent,
          data: { onlyGuests: true },
          canActivate: [ UserAccessGuard ]
      },
    
      // accessible only to authenticated users
      {
          path: 'dashboard',
          component: DashboardComponent,
          canActivate: [ UserAccessGuard ]
      }
    ];
    
    0 讨论(0)
  • 2020-12-31 05:23

    I made some researches to see if it's possible to "negate" a guard but seems like you have to make another guard which is the opposite of your guard. Like :

    import { Injectable } from '@angular/core';
    import { CanActivate } from '@angular/router';
    import { AuthService } from './your-auth.service';
    
    @Injectable()
    export class PreventLoggedInAccess implements CanActivate {
    
      constructor(private authService: AuthService) {}
    
      canActivate() {
        return !this.authService.isLoggedIn();
      }
    } 
    

    Add it in your bootstrap function as well and you are all set. You just have to do in your routes :

    { path: 'login', component: LoginComponent, canActivate: [PreventLoggedInAccess] },
    
    0 讨论(0)
提交回复
热议问题