📜  Angular 中的 Auth Guards 9/10/11

📅  最后修改于: 2022-05-13 01:56:39.800000             🧑  作者: Mango

Angular 中的 Auth Guards 9/10/11

AuthGuard 用于保护路由免受角度未经授权的访问。

AuthGuard 是如何工作的?

Auth Guard 提供名为 canActivate 的生命周期事件。 canActivate 就像一个构造函数。它将在访问路由之前被调用。 canActivate 必须返回 true 才能访问该页面。如果它返回 false,我们将无法访问该页面。我们可以在 canActivate函数中编写我们的用户授权和认证逻辑。

所以在这里我们正在创建一个角度的 AuthGuard,它将保护我们的路由免受未经授权的访问。

示例:我们可以通过使用 CLI 运行简单命令来创建 AuthGuard。

上面的命令在 services 文件夹中创建了 AuthGuard,AuthGuard 的名字是 auth。

auth.guards.ts
import { Injectable } from "@angular/core";
import {
    ActivatedRouteSnapshot,
    CanActivate,
    Router,
    RouterStateSnapshot,
    UrlTree
} 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 | Promise {
        var isAuthenticated = this.authService.getAuthStatus();
        if (!isAuthenticated) {
            this.router.navigate(['/login']);
        }
        return isAuthenticated;
    }
}


app-routing.module.ts
import { NgModule } from '@angular/core';
import { Routes, RouterModule } 
from '@angular/router';
import { AuthGuard } 
from './services/auth.guards';
import { LoginComponent } 
from './auth/login/login.component';
import { SignupComponent } 
from './auth/signup/signup.component';
import { PostCreateComponent } 
from './posts/post-create/post-create.component';
import { PostListComponent } 
from './posts/post-list/post-list.component';
  
const routes: Routes = [
  { path: '', 
  component: PostListComponent },
  { path: 'create', 
  component: PostCreateComponent, 
  canActivate: [AuthGuard]},
  { path: 'edit', 
  component: PostCreateComponent, 
  canActivate: [AuthGuard] },
  { path: 'login', 
  component: LoginComponent },
  { path: 'signup', 
  component: SignupComponent }
];
  
@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],
  providers: [AuthGuard]
})
  
export class AppRoutingModule { }


在 canActivate函数中,我们检查用户是否通过了身份验证,“getAuthStatus”方法返回一个布尔值。所以基于这个值,我们从 canActivate 方法返回值。如果“getAuthStatus”返回值表示用户已通过身份验证,那么我们允许用户访问该页面,否则我们将用户导航到登录页面。

然后我们必须更新我们的路由文件,以便哪个路由受 AuthGuard 保护,以及哪个路由可供每个用户访问。

应用程序路由.module.ts

import { NgModule } from '@angular/core';
import { Routes, RouterModule } 
from '@angular/router';
import { AuthGuard } 
from './services/auth.guards';
import { LoginComponent } 
from './auth/login/login.component';
import { SignupComponent } 
from './auth/signup/signup.component';
import { PostCreateComponent } 
from './posts/post-create/post-create.component';
import { PostListComponent } 
from './posts/post-list/post-list.component';
  
const routes: Routes = [
  { path: '', 
  component: PostListComponent },
  { path: 'create', 
  component: PostCreateComponent, 
  canActivate: [AuthGuard]},
  { path: 'edit', 
  component: PostCreateComponent, 
  canActivate: [AuthGuard] },
  { path: 'login', 
  component: LoginComponent },
  { path: 'signup', 
  component: SignupComponent }
];
  
@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule],
  providers: [AuthGuard]
})
  
export class AppRoutingModule { }

在 routes 数组中,我们提供了 canActivate: [AuthGuard] 来“创建”和“编辑”路由,因此这两个路由只对经过身份验证的用户开放,其他路由对所有用户开放。

确保在此路由文件中导入 AuthGuard,并将其添加到 @NgModule 提供程序中。

这就是我们如何在 AngularJS 中保护路由免受未经授权的访问。