下面是一个使用订阅的Angular Auth Guard的示例解决方案。
首先,创建一个名为AuthGuardService
的服务:
import { Injectable } from '@angular/core';
import { CanActivate, Router } from '@angular/router';
import { AuthService } from './auth.service';
@Injectable({
providedIn: 'root'
})
export class AuthGuardService implements CanActivate {
constructor(private authService: AuthService, private router: Router) { }
canActivate(): boolean {
return this.authService.isAuthenticated().subscribe(
(isAuthenticated: boolean) => {
if (isAuthenticated) {
return true;
} else {
this.router.navigate(['/login']);
return false;
}
}
);
}
}
在上面的代码中,AuthGuardService
实现了CanActivate
接口,该接口允许我们在路由导航之前进行身份验证检查。canActivate
方法使用AuthService
中的isAuthenticated
方法来检查用户是否已经通过身份验证。
接下来,创建一个名为AuthService
的服务,该服务负责处理身份验证逻辑:
import { Injectable } from '@angular/core';
import { Observable, of } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class AuthService {
private isAuthenticatedFlag: boolean = false;
constructor() { }
isAuthenticated(): Observable {
return of(this.isAuthenticatedFlag); // Replace with your actual authentication logic
}
login(): void {
// Replace with your actual login logic
this.isAuthenticatedFlag = true;
}
logout(): void {
// Replace with your actual logout logic
this.isAuthenticatedFlag = false;
}
}
在上面的代码中,我们使用一个名为isAuthenticatedFlag
的变量来模拟用户是否通过身份验证。在实际应用中,您应该使用自己的身份验证逻辑来替换该变量。
最后,在路由模块中使用AuthGuardService
来保护需要身份验证的路由。例如,假设您有一个名为DashboardComponent
的组件需要进行身份验证:
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { DashboardComponent } from './dashboard/dashboard.component';
import { AuthGuardService } from './auth-guard.service';
const routes: Routes = [
{ path: 'dashboard', component: DashboardComponent, canActivate: [AuthGuardService] },
// Other routes...
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
在上面的代码中,我们使用canActivate
属性将AuthGuardService
应用到DashboardComponent
路由上。
希望这个示例能帮助到您!