2017-07-11 2 views
1

Die Funktionalität, die ich erreichen möchte in der Lage ist, eine URL wie das haben:Angular Routing canActivate AuthGuard Sende Abfrage params

https://myapp.com/?orgId=xxx & username = yyy

Das wird mein Login-Formular ausfüllen.

Das Login-Formular bereits vorgefüllten, wenn diese Parameter, wenn sie auf diese Weise direkt eingestellt werden: https://myapp.com/en/login?orgId=xxx & username = yyy

Diese URL ist In einer E-Mail gesendet, und wir können argumentieren, dass ich einfach die vollständige URL in die E-Mail (mit der /de/login) setzen sollte. Aber die Sache ist, dass die App multilang AOT ist und ich würde bevorzugen, dass der email Link lang unabhängig ist.

ist die App mit zwei Router organisiert:

  • die Standard App Router, der die Login-Seite und alle anderen unbesicherten Komponenten und Dienstleistungen
  • die Haupt Router die Route alle gesichert Griff Komponenten und bieten die Dienste. Es hat einen canActivate AuthGuard, der auf die Anmeldeseite umleitet, wenn er nicht authentifiziert ist.

Ich habe hinzugefügt, um den queryParamsHandling: 'bewahren' Option, wenn in den AuthGuard navigieren aufrufen.

this.router.navigate(['/login'], {queryParamsHandling: 'preserve'}); 

Hier sind die Konsolenprotokolle ich aus ermöglicht Tracing haben:

Router Event: NavigationStartvendor.bundle.js:16782 
    NavigationStart(id: 1, url: '/?param=123') vendor.bundle.js:16773:35 
Router Event: RoutesRecognizedvendor.bundle.js:16782 
    RoutesRecognized(id: 1, url: '/?param=123', urlAfterRedirects:'/dashboard', state: Route(url:'', path:'') { Route(url:'', path:'') { Route(url:'dashboard', path:'dashboard') } }) vendor.bundle.js:16773:35 
[AuthGuard] route Object { url: Array[0], params: Object, queryParams: Object, fragment: null, data: Object, outlet: "primary", component: MainComponent(), _routeConfig: Object, _urlSegment: Object, _lastPathIndex: -1, 2 de plus… } main.bundle.js:2629:9 
[AuthGuard] state Object { _root: Object, url: "/dashboard" } main.bundle.js:2630:9 
Router Event: NavigationCancelvendor.bundle.js:16782 
    NavigationCancel(id: 1, url: '/?param=123') vendor.bundle.js:16773:35 
Router Event: NavigationStartvendor.bundle.js:16782 
    NavigationStart(id: 2, url: '/login') vendor.bundle.js:16773:35 
Router Event: RoutesRecognizedvendor.bundle.js:16782 
    RoutesRecognized(id: 2, url: '/login', urlAfterRedirects: '/login', state: Route(url:'', path:'') { Route(url:'login', path:'login') }) vendor.bundle.js:16773:35 
Router Event: NavigationEndvendor.bundle.js:16782 
    NavigationEnd(id: 2, url: '/login', urlAfterRedirects: '/login') vendor.bundle.js:16773:35 

ich auch die Eingänge des AuthGuard canActivate gedruckt haben (Route: ActivatedRouteSnapshot, Zustand: RouterStateSnapshot).

Wir können sehen, dass die param vorhanden direkt vor dem AuthGuard canActivate ist, aber ich nicht in der Lage im ActivatedRouteSnapshot zu finden, noch die RouterStateSnapshot.

Ich hoffe, ich war klar genug.

Bitte zögern Sie nicht, für weitere Informationen zu fragen.

Antwort

2

Bei Verwendung eines Routers innerhalb eines Schutzes wird queryParamsHandling nicht behandelt. Sie müssen die Umleitungsabfrageparameter manuell festlegen, indem Sie sie aus der aktivierten Route extrahieren:

Verwandte Themen