我正在将 AuthGuard 与 firebase 一起使用,并且在限制对选定路由的访问方面一切正常,除了 routerLinks 本身即使在经过身份验证后也会通过点击“禁用”。但是当我直接通过 URL 访问它们时,我可以访问这些路由。谁能帮我这个?
auth.guard.ts
import { Injectable } from '@angular/core';
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'
import { AuthService } from '../services/auth.service'
import { AngularFireAuth } from 'angularfire2/auth'
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(
private router: Router,
private auth: AuthService,
private afAuth: AngularFireAuth,
private authService: AuthService
) { }
canActivate(): Observable<boolean> {
return this.afAuth.authState.pipe(map(auth => {
if(!auth) {
this.router.navigate(['/login']);
return false;
} else {
return true;
}
}));
}
}
应用程序路由.module.ts
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
// Components
import { DashboardComponent } from './components/dashboard/dashboard.component';
import { LoginComponent } from './components/login/login.component';
import { RegisterComponent } from './components/register/register.component';
import { AddClientComponent } from './components/add-client/add-client.component';
import { EditClientComponent } from './components/edit-client/edit-client.component';
import { ClientDetailsComponent } from './components/client-details/client-details.component';
import { SettingsComponent } from './components/settings/settings.component';
import { NotFoundComponent } from './components/not-found/not-found.component';
import { AuthGuard } from './guards/auth.guard';
const routes: Routes = [
{path: '', component: DashboardComponent, canActivate:[AuthGuard]},
{path: 'login', component: LoginComponent},
{path: 'register', component: RegisterComponent},
{path: 'client/add', component: AddClientComponent, canActivate:[AuthGuard]},
{path: 'client/edit/:id', component: EditClientComponent, canActivate:[AuthGuard]},
{path: 'client/:id', component: ClientDetailsComponent, canActivate:[AuthGuard]},
{path: 'settings', component: SettingsComponent, canActivate:[AuthGuard]},
{path: '**', component: NotFoundComponent},
];
@NgModule({
declarations: [],
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule],
providers: [AuthGuard]
})
export class AppRoutingModule { }
登录组件.ts
onSubmit() {
this.authService.login(this.email, this.password)
.then(res => {
this.flashMessage.show('You are now logged in', {
cssClass: 'alert-success text-center', timeout: 4000
});
this.router.navigate(['/']);
})
.catch(err => {
this.flashMessage.show(err.message, {
cssClass: 'alert-danger text-center', timeout: 4000
});
})
}
另请注意,this.router.navigate(['/']);
有时不起作用,这真的很奇怪,让我认为这是某种错误。
这是示例 routerLinks 的 navbar.component.html
<ul class="navbar-nav ml-auto">
<li *ngIf="!isLoggedIn" class="nav-item">
<a routerLink="/register" class="nav-link">Register</a>
</li>
<li *ngIf="!isLoggedIn" class="nav-item">
<a routerLink="/login/" class="nav-link">Login</a>
</li>
<li *ngIf="isLoggedIn" class="nav-item">
<a href="#" class="nav-link">{{ loggedInUser }}</a>
</li>
<li *ngIf="isLoggedIn" class="nav-item">
<a routerLink="/settings" class="nav-link">Settings</a>
</li>
<li *ngIf="isLoggedIn" class="nav-item">
<a href="#" (click)="onLogoutClick()" class="nav-link">Logout</a>
</li>
</ul>