代码之家  ›  专栏  ›  技术社区  ›  Miguel Frias

角度认证。guard no persisten auth

  •  1
  • Miguel Frias  · 技术社区  · 8 年前

    刷新页面后,身份验证似乎不会持续。每当我登录时,它都会成功重定向我。但是,当我刷新时,无法再访问。

    这是auth guard

    路由器

    import { BrowserModule } from '@angular/platform-browser';
    import { NgModule } from '@angular/core';
    import { RouterModule, Routes } from '@angular/router';
    import { FormsModule } from '@angular/forms';
    import { AppRoutingModule } from './app-routing.module';
    import { AppComponent } from './app.component';
    import { NavComponent } from './components/nav/nav.component';
    import { HomeComponent } from './components/home/home.component';
    import { GalleryComponent } from './components/gallery/gallery.component';
    import { FooterComponent } from './components/footer/footer.component';
    
    import { AngularFireModule } from 'angularfire2';
    import { AngularFireAuthModule } from 'angularfire2/auth';
    import { AngularFireDatabaseModule, AngularFireDatabase } from 'angularfire2/database';
    import { FIREBASECONFIG as firebaseConfig } from './config/firebase-config';
    
    import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
    import { ScrollToModule } from 'ng2-scroll-to';
    import { NgxCarouselModule } from 'ngx-carousel';
    import { AnimateOnScrollModule } from 'ng2-animate-on-scroll';
    
    import { AuthService } from './services/auth.service';
    import { AuthGuard } from './services/auth.guard.service';
    
    import { HttpClientModule, HttpClient } from '@angular/common/http';
    import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
    import { TranslateHttpLoader } from '@ngx-translate/http-loader';
    
    
    const routes: Routes = [
      { path: '', component: HomeComponent },
      { path: 'gallery', component: GalleryComponent, canActivate: [AuthGuard] }
    ];
    
    @NgModule({
      declarations: [
        AppComponent,
        NavComponent,
        HomeComponent,
        GalleryComponent,
        FooterComponent,
      ],
      imports: [
        FormsModule,
        BrowserModule,
        AppRoutingModule,
        NgxCarouselModule,
        NgbModule.forRoot(),
        ScrollToModule.forRoot(),
        RouterModule.forRoot(routes),
        AnimateOnScrollModule.forRoot(),
        HttpClientModule,
        AngularFireModule.initializeApp(firebaseConfig),
        AngularFireAuthModule,
        AngularFireDatabaseModule,
        TranslateModule.forRoot({
          loader: {
            provide: TranslateLoader,
            useFactory: HttpLoaderFactory,
            deps: [HttpClient]
          }
        })
      ],
      exports: [
        TranslateModule
      ],
      providers: [AngularFireDatabase, AuthService, AuthGuard],
      bootstrap: [AppComponent]
    })
    

    认证。警卫输电系统

    import { Observable } from 'rxjs/Observable';
    import { AuthService } from './auth.service';
    import { AngularFireAuth } from 'angularfire2/auth';
    import { Injectable, OnInit } from '@angular/core';
    import { CanActivate, Router, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router';
    
    @Injectable()
    export class AuthGuard implements CanActivate {
      public user = null;
      constructor(private fireauth: AngularFireAuth, private router: Router) {
        this.fireauth.auth.onAuthStateChanged((user) => {
          if (user) {
            this.user = this.fireauth.auth.currentUser;
          }
        });
      }
    
      ongOnInit() {
      }
    
      canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): any {
        if (this.user) {
          return true;
        } else {
          this.router.navigate(['']);
          return false;
        }
      }
    }
    

    根据我的说法,路线是可以的,我想问题最主要的是在auth-guard上。

    1 回复  |  直到 8 年前
        1
  •  5
  •   Hareesh    8 年前

    尝试此代码

    constructor(
        private router:Router,
        public fireauth:AngularFireAuth
    ){}
    
    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean> | Promise<boolean> {
        return this.fireauth.authState.map((auth) =>  {
            if(auth == null) {
              this.router.navigate(['/']);
              return false;
            } else {
              return true;
            }
          });
    }
    

    我想 this.fireauth.auth.onAuthStateChanged 在旧版本中使用