2017-12-20 6 views
1

In CanActivate gibt es eine Möglichkeit zu überprüfen, welche Komponente vom Benutzer zur Authentifizierung weitergeleitet/angefordert wird. Also, anstatt die URL wie unten zu überprüfen, möchte ich etwas wie if tun (route.component instanceof MyComponent).Angular 4 - CanActivate Prüfkomponente wird route

Ich implementiere einen rollenbasierten Zugriff mit der Möglichkeit, jede Rolle so zu konfigurieren, dass sie unterschiedliche Zugriffsebenen (anzeigen, bearbeiten usw.) für unterschiedliche Komponenten hat. Die einfachste Sache, die ich dachte, wäre, die aktuelle Komponente zu routen und dann die Zugriffsebene für diese Komponente zu überprüfen, anstatt für jede Komponente eine andere AuthGard zu erstellen.

Ich versuche dies zu tun, indem Sie URL überprüfen, aber sein Gehäuseproblem, wenn Parameter in der URL enthalten ist.

canActivate(route: ActivatedRouteSnapshot, 
     state: RouterStateSnapshot) {  
      let ac = this.auth.getAccessConfig(); 
      switch (state.url) { 
       case '/site': 
        return ac.some(x => x.moduleID == AccessModulesEnum.Site && x.permissionID == AccessPermissionEnum.View); 
       case '/site/new': 
        return ac.some(x => x.moduleID == AccessModulesEnum.Site && x.permissionID == AccessPermissionEnum.Modify); 
       case '/site/:id': ***//this doesn't work as :id could be anything*** 
        return ac.some(x => x.moduleID == AccessModulesEnum.SiteDetail && x.permissionID == AccessPermissionEnum.View); 
       case '/reports/milestone': 
        return ac.some(x => x.moduleID == AccessModulesEnum.MilestoneReport && x.permissionID == AccessPermissionEnum.View); 
       case '/reports/audit': 
        return ac.some(x => x.moduleID == AccessModulesEnum.AuditReport && x.permissionID == AccessPermissionEnum.View); 
       case '/reports/schedule': 
        return ac.some(x => x.moduleID == AccessModulesEnum.ReportScheduler && x.permissionID == AccessPermissionEnum.View); 
       case '/importer': 
        return ac.some(x => x.moduleID == AccessModulesEnum.Import && x.permissionID == AccessPermissionEnum.View); 
       case '/reports': 
        return ac.some(x => x.moduleID == AccessModulesEnum.SiteReport && x.permissionID == AccessPermissionEnum.View); 
       case '/admin/users': 
        return ac.some(x => x.moduleID == AccessModulesEnum.User && x.permissionID == AccessPermissionEnum.View); 
       case '/admin/tables': 
        return ac.some(x => x.moduleID == AccessModulesEnum.ReferenceTable && x.permissionID == AccessPermissionEnum.View); 
       default: 
        return false; 
      } 
     }); 
    } 

Eine andere Frage: Ist es möglich AuthGard mit Parameter von Routen Konfiguration wie {Pfad zu nennen: 'site /: id', Komponente: SiteDetail, canActivate: [(callCustomeAuthGard ('SiteDetailComponent')]

Dank

Antwort

0

hat Lösung für das obige Problem gefunden mit route.routeConfig.path statt uRL für Routenweg zu überprüfen, das sein wird. ‚site /: id‘ anstelle von ‚site/2‘

Aber ich möchte, wenn es eine bessere Möglichkeit gibt, wie oben beschrieben eine Rollenbasis-Authentifizierung durchzuführen.

0

Haben Sie versucht route.component? According to the docs, sollte dies die Komponentenklasse enthalten, an die geroutet wird.

Wenn ja, könnte der Aktivierungsschutz die Komponentenklasse fragen, welche Berechtigungen er benötigt.

+0

ja, ich tat aber nicht jetzt wie überprüfe/vergleiche ich welche Komponente es ist. (route.component instanceof MyComponent) funktioniert. – Bhavesh

+0

Versuchen Sie 'route.component == MyComponent' – meriton

Verwandte Themen