Angular2 - Redirect to calling url after successful login

后端 未结 3 978
说谎
说谎 2020-11-28 09:30

I have my application up and running with Angular 2.1.0. The routes are protected via router Guards, canActivate.

When pointing the browser to a protected area like

3条回答
  •  醉梦人生
    2020-11-28 09:52

    There's a great example in the Angular Docs, Teach Authguard To Authenticate. Basically the idea is using your AuthGuard to check for your login status and store the url on your AuthService. Some of the code is on the url above.

    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 or your 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 {
        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;
      }
    }
    

    I think this will give an idea how things work, of course you probably need to adapt to your code

提交回复
热议问题