2016-09-28 5 views
10

Ich habe eine AccessGuard-Klasse in meinem Projekt, die ihre Arbeit ist, um festzustellen, ob Benutzer auf die Route zugreifen kann oder nicht. Ich benutzte die router.url, um die aktuelle Route zu erhalten, aber die URL gibt die Route vor der Navigation zur neuen Route zurück, wie ich in der Benutzerroute bin, und ich klicke auf die Kandidatenroute, so dass die URL Benutzer anstelle von Kandidaten zurückgibt, die ich validieren möchte Zugriff auf die Route dies ist meine Route-Datei:Angular 2 erhalten aktuelle Route in Wache

const routes:Routes = [ 
{ 
    path:'', 
    component:PanelComponent, 
    canActivate:[AuthGuard,AccessGuard], 
    canActivateChild:[AuthGuard,AccessGuard], 
    children:[ 
     { 
      path:'dashboard', 
      component:DashboardComponent 
     }, 
     { 
      path:'users', 
      component:UsersComponent 
     }, 
     { 
      path:'users/:id', 
      component:ShowUserComponent 
     }, 
     { 
      path:'candidates', 
      component:CandidatesComponent 
     }, 
     { 
      path:'permissions', 
      component:PermissionsComponent 
     }, 
     { 
      path:'holidays', 
      component:HolidaysComponent 
     }, 
     { 
      path:'candidate/:id', 
      component:CandidateComponent 
     }, 
     { 
      path:'salary/create', 
      component:InsertSalaryComponent 
     }, 
     { 
      path:'document/create', 
      component:InsertDocumentComponent 
     }, 
     { 
      path:'leave/create', 
      component:InsertLeaveComponent 
     } 
    ] 
} 

]; 

und das ist mein Zugang Wache:

permissions; 
currentRoute; 
constructor(private authService:AuthService,private router:Router){ 
    this.permissions = this.authService.getPermissions(); 
} 

canActivate(){ 
    return this.checkHavePermission(); 
} 

canActivateChild(){ 
    console.log(this.router.url); 
    return this.checkHavePermission(); 
} 

private checkHavePermission(){ 
    switch (this.router.url) { 
     case "/panel/users": 
      return this.getPermission('user.view'); 
     case '/panel/dashboard': 
      return true; 
     case '/panel/candidates': 
      return this.getPermission('candidate.view'); 
     default: 
      return true; 
    } 
} 


getPermission(perm){ 
    for(var i=0;i<this.permissions.length;i++){ 
     if(this.permissions[i].name == perm){ 
      return true; 
     } 
    } 
    return false; 
} 

Antwort

13

Sie müssen die Verfahrensparameter verwenden, um die Zielroute zu sehen:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { 
    console.log(state.url);//'candidates' 
} 

canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot) 
+0

ich Frage nur habe ich die ActivatedRouteSnapshot von Parametern entfernt und die state.url hat ein Array zurückgegeben, aber wenn ActivatedRouteSnapshot in Argumenten ist, übergibt es die tatsächliche URL warum? –

+0

Sie sollten ActivatedRouteSnapshot nicht aus Parametern entfernen, auch wenn Sie nur den RouterStateSnapshot-Parameter verwenden möchten. Die Parameter sind durch Position definiert. Der erste Parameter ist immer ActivatedRouteSnapshot und sein URL-Feld ist ein Array. Der zweite Parameter ist immer der RouterStateSnapshot-Parameter und sein URL-Feld ist eine Zeichenfolge. Ich hoffe es hilft. –

+0

Vorsicht: Wenn Ihre URL queryparams hat, müssen Sie dies möglicherweise tun: 'console.log (state.urlsubstring (0, state.url.indexOf ("? ")));' –

1

dies könnte Ihnen helfen:

  1. Import ActivatedRouteSnapshot und RouterStateSnapshot:

    import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot} from '@angular/router';

  2. Signatur im canActivate:

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable {}

  3. Überprüfen Sie den Zustand:

    console.log("route-access",state);

der Hut-Datei wie folgt aussehen würde:

import { Injectable } from '@angular/core'; 
    import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot} from '@angular/router'; 
    import { Observable } from 'rxjs'; 
    import { AutenticacionService } from 'app/services/index'; 
    @Injectable() 
    export class AuthGuard implements CanActivate { 
     constructor(private _router: Router, private auth:AutenticacionService) {} 
    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<boolean> { 
     // console.log("route-access",state); 
     let _url:string=""; 
     state.url.split("/").forEach(element => { 
      if(_url==="") 
       if(element!=="") 
        _url=element; 
     }); 
     // console.log(_url); 
     return this.auth.check(_url) 
      .map((result) => { 
        if (result) { 
         return true; 
        } else { 
         this._router.navigate(['/']); 
         return false; 
        } 
       }); 
    } 

} 
Verwandte Themen