2016-10-13 31 views
9

Uygulamamı Angular 2.1.0 ile çalıştırıyorum. Rotalar yönlendirici Muhafızlar, canActivate ile korunmaktadır.Angular2 - Başarılı giriş yaptıktan sonra URL'yi aramaya yönlendirin

Tarayıcı "localhost: 8080/customers" gibi korunan bir alana işaret ettiğinde, beklendiği gibi giriş sayfama yönlendirilirim.

Ancak başarılı bir girişten sonra, tekrar arama URL'sine (bu durumda "/ müşteriler") yönlendirilmek istiyorum.

giriş işlemek için kod sorundur bu

login(event, username, password) { 
    event.preventDefault(); 
    var success = this.loginService.login(username, password); 
    if (success) { 
    console.log(this.router); 
    this.router.navigate(['']); 
    } else { 
    console.log("Login failed, display error to user"); 
    } 
} 

benziyor, ben giriş yönteminin içinden çağıran url bir tutun almak için nasıl bilmiyorum.

Bu konuyla ilgili bir soru (ve cevap) buldum ama gerçekten bir anlam ifade edemedim. Angular2 Redirect After Login

cevap

20

Angular Docs, Teach Authguard To Authenticate'da harika bir örnek var. Temel olarak fikir, giriş durumunuzu kontrol etmek ve URL'nizi AuthService'inizde saklamak için AuthGuard'ınızı kullanıyor. Kodun bir kısmı yukarıdaki URL üzerindedir.

AuthGuard

import { Injectable }  from '@angular/core'; 
import { 
    CanActivate, Router, 
    ActivatedRouteSnapshot, 
    RouterStateSnapshot 
}       from '@angular/router'; 
import { AuthService }  from './auth.service'; 

@Injectable() 
export class AuthGuard implements CanActivate { 
    constructor(private authService: AuthService, private router: Router) {} 

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { 
    let url: string = state.url; 

    return this.checkLogin(url); 
    } 

    checkLogin(url: string): boolean { 
    if (this.authService.isLoggedIn) { return true; } 

    // Store the attempted URL for redirecting 
    this.authService.redirectUrl = url; 

    // Navigate to the login page with extras 
    this.router.navigate(['/login']); 
    return false; 
    } 
} 

AuthService veya LoginService

import { Injectable } from '@angular/core'; 
import { Http, Response } from '@angular/http'; 
import { Router } from '@angular/router'; 

@Injectable() 
export class AuthService { 
    isLoggedIn: boolean = false;  
    // store the URL so we can redirect after logging in 
    public redirectUrl: string; 

    constructor (
    private http: Http, 
    private router: Router 
) {} 

    login(username, password): Observable<boolean> { 
    const body = { 
     username, 
     password 
    }; 
    return this.http.post('api/login', JSON.stringify(body)).map((res: Response) => { 
     // do whatever with your response 
     this.isLoggedIn = true; 
     if (this.redirectUrl) { 
     this.router.navigate([this.redirectUrl]); 
     this.redirectUrl = null; 
     } 
    } 
    } 

    logout(): void { 
    this.isLoggedIn = false; 
    } 
} 

bu işler elbette muhtemelen kod adapte gerekir, nasıl çalıştığını bir fikir verecektir düşünüyorum

+0

Gerçekten biraz mola vermem gerek. Ben angular.io bu sayfada çok fazla okudum ve böyle bariz bir örneği kaçırmışsınız ... neyse, çok teşekkürler, bu gerçekten hile yaptı :) Ben window.location depolama kullanarak başka bir çözüm buldum. Aynı mannordaki yol adı ama sağladığınız çözüm, bunu yapmak için açısal yol gibi görünüyor. –

+1

@AndersBergquist Bu duyguyu biliyorum, sürekli dokümanlar okuyorum ve yeni şeyler öğreniyorum –

İlgili konular