Check if the user logged in on any page change in Angular 2

后端 未结 4 1082
Happy的楠姐
Happy的楠姐 2020-12-15 00:00

Slowly but surely progressing with Angular2. And now I faced the following challenge. I want to check if the user logged in or not on every page change (in other words on lo

4条回答
  •  遥遥无期
    2020-12-15 00:08

    I'm showing you simple implementation with Angular2. You can take advantage of @CanActivate hook as shown blow to check whether the user is loggedIn or not with isLoggedIn function which returns promise.

    NOTE: below implementation is to check whether user is loggedIn before accessing any component or not. I hope by some modification you can achieve what you want to have.

    Auth.ts

    import {Observable} from 'rxjs/Observable';
    
    export class Auth {
      constructor() {
        this.loggedIn = false;
      }
    
      login() {
        this.loggedIn = true;
      }
    
      logout() {
        this.loggedIn = false;
      }
    
      check() {
        return Observable.of(this.loggedIn);
      }
    }
    

    isLoggedIn.ts

    import {Injector} from 'angular2/core';
    import {appInjector} from './appInjector';
    import {Auth} from './Auth';
    import {Router, ComponentInstruction} from 'angular2/router';
    
    export const isLoggedIn = (next: ComponentInstruction, previous: ComponentInstruction) => {
        let injector: Injector = appInjector(); // get the stored reference to the injector
        let auth: Auth = injector.get(Auth);
        let router: Router = injector.get(Router);
    
      // return a boolean or a promise that resolves a boolean
        return new Promise((resolve) => {
          auth.check()
              .subscribe((result) => {
                        if (result) {
                            resolve(true);
                        } else {
                            router.navigate(['/Login']);
                            resolve(false);
                        }
                    });
      });
    };
    

    appInjector.ts

    import {Injector} from 'angular2/core';
    
    let appInjectorRef: Injector;
    export const appInjector = (injector?: Injector):Injector => {
        if (injector) {
          appInjectorRef = injector;
        }
    
        return appInjectorRef;
    };
    

    somecomponent.ts

    import {Component, View,ViewChild} from 'angular2/core';
    import {CanActivate} from 'angular2/router';
    import {isLoggedIn} from './isLoggedIn';
    
    @Component({
      selector: 'some',
      template: 'some text'
    })
    @CanActivate((next: ComponentInstruction, previous: ComponentInstruction) => {
      return isLoggedIn(next, previous);  // this will tell whether user is loggedIn or not. 
    })
    export class Protected {
    }
    

    boot.ts

    .
    .
    import { provide, ComponentRef } from 'angular2/core';
    import { appInjector } from './app-injector';
    .
    .
    bootstrap(AppComponent, [...]).then((appRef: ComponentRef) => {
      // store a reference to the application injector
      appInjector(appRef.injector);
    });
    

    There are two ways to restrict access Custom Router Outlet and CanActivate Decorator shown and implemented in this great article Authentication in Angular 2

提交回复
热议问题