2016-07-23 7 views
2

In Angular 2 Wie kann ich einen Benutzer umleiten, wenn sie nicht authentifiziert verwenden Router Version 2.0.0-rc.1Wie kann ich einen Benutzer umleiten, wenn sie mit nicht authentifiziert sind Router

Ich bin auf der Suche zu tun dies in meiner app.component, wo meine Routen gespeichert sind.

Ich möchte erkennen, ob der Benutzer authentifiziert wird, bevor es eine Seitenkomponente trifft. So kann ich sie dann zum Login umleiten.

Ich habe versucht canActivate die nicht scheint, um für meine Router-Version zu arbeiten.

Ich bin auf der Suche nach einer Lösung für diese Version des Routers: "@ Winkel/Router": "2.0.0-rc.1"

ODER

Eine Lösung für die neuesten Version des Routers. Wenn einer bereitgestellt wird, können Sie mir zeigen, wie ich meine Router-Version mit git bash mit dieser Lösung aktualisieren kann.

Dies ist meine aktuellen Code:

export class AppComponent implements CanActivate { 
    authService: AuthService; 
    userService: UserService; 

    constructor(_authService: AuthService, _userService: UserService, private location: Location, private router: Router) { 
     this.authService = _authService; 
     this.userService = _userService; 
    } 

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable <boolean> | boolean { 

     //This doesnt get hit 
     console.log("here"); 

     return true; 
    } 
} 
+1

John Papa hat ein ziemlich gutes Beispiel für die Verwendung CanActivate/CanDeactivate hier: https://github.com/johnpapa/Ereignisansicht. Obwohl er RC4 benutzt. –

+0

Was ist der Befehl git bash, um mein Router-Knotenmodul zu aktualisieren? Für rc4 – AngularM

+0

Idealerweise möchte ich meine aktuelle Router-Version verwenden – AngularM

Antwort

2

Verwenden Sie ein Interceptor:

import {bootstrap} from '@angular/platform-browser-dynamic'; 
import {provide} from '@angular/core'; 
import {HTTP_PROVIDERS, Http, Request, RequestOptionsArgs, Response, XHRBackend, RequestOptions, ConnectionBackend, Headers} from '@angular/http'; 
import {ROUTER_PROVIDERS, Router} from '@angular/router'; 
import {LocationStrategy, HashLocationStrategy} from '@angular/common'; 
import { Observable } from 'rxjs/Observable'; 
import * as _ from 'lodash' 

import {MyApp} from './app/my-app'; 

class HttpInterceptor extends Http { 

    constructor(backend: ConnectionBackend, defaultOptions: RequestOptions, private _router: Router) { 
     super(backend, defaultOptions); 
    } 

    request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> { 
     return this.intercept(super.request(url, options)); 
    } 

    get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
     return this.intercept(super.get(url,options)); 
    } 

    post(url: string, body: string, options?: RequestOptionsArgs): Observable<Response> { 
     return this.intercept(super.post(url, body, this.getRequestOptionArgs(options))); 
    } 

    put(url: string, body: string, options?: RequestOptionsArgs): Observable<Response> { 
     return this.intercept(super.put(url, body, this.getRequestOptionArgs(options))); 
    } 

    delete(url: string, options?: RequestOptionsArgs): Observable<Response> { 
     return this.intercept(super.delete(url, options)); 
    } 

    getRequestOptionArgs(options?: RequestOptionsArgs) : RequestOptionsArgs { 
     if (options == null) { 
      options = new RequestOptions(); 
     } 
     if (options.headers == null) { 
      options.headers = new Headers(); 
     } 
     options.headers.append('Content-Type', 'application/json'); 
     return options; 
    } 

    intercept(observable: Observable<Response>): Observable<Response> { 
     return observable.catch((err, source) => { 
      if (err.status == 401 && !_.endsWith(err.url, 'api/auth/login')) { 
       this._router.navigate(['/login']); 
       return Observable.empty(); 
      } else { 
       return Observable.throw(err); 
      } 
     }); 

    } 
} 

bootstrap(MyApp, [ 
    HTTP_PROVIDERS, 
    ROUTER_PROVIDERS, 
    provide(LocationStrategy, { useClass: HashLocationStrategy }), 
    provide(Http, { 
     useFactory: (xhrBackend: XHRBackend, requestOptions: RequestOptions, router: Router) => new HttpInterceptor(xhrBackend, requestOptions, router), 
     deps: [XHRBackend, RequestOptions, Router] 
    }) 
]) 
.catch(err => console.error(err)); 
+0

Ich bin auf der Suche nach einer Lösung, um meine app.component-Datei hinzufügen, wo meine Routen sind. Ich möchte die Route abfangen, bevor sie auf die Seitenkomponente trifft, sodass ich sie zur Anmeldeseite umleiten kann, wenn sie nicht authentifiziert wird. – AngularM

+0

Ich bin überrascht, dass dies die Antwort ist, da es etwa 4-5 mal mehr Code als Lösung des gleichen Problems in eckig ist 1. – davidbuttar

+0

Nun, Sie könnten nur die "Get" -Methode überschreiben – AngJobs

Verwandte Themen