关于 Angular 中的 AuthGuard
Posted JerryWangSAP
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于 Angular 中的 AuthGuard相关的知识,希望对你有一定的参考价值。
Angular 中的 AuthGuard 是一个路由守卫,它用于保护某些路由,只有当用户经过身份验证并具有访问权限时,才允许他们访问。AuthGuard 通常与路由配置一起使用,以确保用户无法直接访问需要身份验证的页面。
AuthGuard 是一个 Angular 服务,可以使用以下命令来创建它:
ng g guard auth
上面的命令将生成一个名为“auth”的 AuthGuard,并将其添加到 src/app/auth.guard.ts
文件中。auth.guard.ts
文件中的代码如下所示:
import Injectable from \'@angular/core\';
import CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router from \'@angular/router\';
import Observable from \'rxjs\';
import AuthService from \'./auth.service\';
@Injectable(
providedIn: \'root\'
)
export class AuthGuard implements CanActivate
constructor(private authService: AuthService, private router: Router)
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree
if (this.authService.isLoggedIn())
return true;
else
this.router.navigate([\'/login\']);
return false;
在上面的代码中,AuthGuard 是通过实现 CanActivate 接口来定义的。CanActivate 接口包含一个名为 canActivate()
的方法,该方法决定了当用户尝试访问受保护的路由时应该执行哪些操作。
在 AuthGuard 中,我们注入了一个名为 AuthService
的服务和 Router
对象。AuthService
用于检查用户是否已经登录,而 Router
用于导航到登录页面或者用户试图访问的页面。在 canActivate()
方法中,我们首先调用 this.authService.isLoggedIn()
方法来检查用户是否已经登录。如果用户已经登录,我们返回 true,表示用户可以访问该路由。否则,我们调用 this.router.navigate([\'/login\'])
方法,将用户重定向到登录页面,然后返回 false,表示用户无法访问该路由。
要使用 AuthGuard 来保护一个路由,我们需要在路由配置中将 AuthGuard 添加到 canActivate
属性中。例如:
import NgModule from \'@angular/core\';
import Routes, RouterModule from \'@angular/router\';
import HomeComponent from \'./home/home.component\';
import DashboardComponent from \'./dashboard/dashboard.component\';
import LoginComponent from \'./login/login.component\';
import AuthGuard from \'./auth.guard\';
const routes: Routes = [
path: \'\', component: HomeComponent ,
path: \'dashboard\', component: DashboardComponent, canActivate: [AuthGuard] ,
path: \'login\', component: LoginComponent ,
];
@NgModule(
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
)
export class AppRoutingModule
在上面的代码中,我们将 AuthGuard 添加到了 /dashboard
路由的 canActivate
属性中,这意味着只有当用户已经登录时才能访问 /dashboard
路由。
Angular 如何从 authguard 中检索?
【中文标题】Angular 如何从 authguard 中检索?【英文标题】:Angular how can I retrieve from authguard? 【发布时间】:2020-03-02 03:56:08 【问题描述】:我有一个带有 jwt 身份验证的 Angular-springboot 程序,我想知道如何在 Angular 上登录后,恢复登录者的数据,例如用户名。我查看了一些关于 authguard 和 httpinterceptors 的指南,但我对 rigurado 有点困惑,你们中的任何人都可以给我发一个它检索数据的代码吗?我从指南中复制了一些服务,这些服务是 auth-guard、身份验证、basic-auth-http-interceptors 和 httpclient,我认为这些服务非常标准,但如果需要,我会发布它们
【问题讨论】:
您好,首先,您列出的某些服务并未真正用于检索/获取数据。例如: - Authguard:如果您指的是 RouteGuard,这些用于允许/阻止用户访问特定路由,这通常基于身份验证 (angular.io/guide/router#milestone-5-route-guards) - HttpInterceptors:这些用于执行任何针对您想要定位的任何 API 请求的附加逻辑 (angular.io/api/common/http/HttpInterceptor) 一旦经过身份验证的用户登录,您将如何处理他们的详细信息? (比如他们的 id) TYPO 警报 - 它是 警卫 - 不是“守卫” .... 【参考方案1】:当用户登录系统时,将令牌类型和jwt令牌保存在本地存储中。在 TokenInterceptor 的帮助下,它会在每个请求中发送标头详细信息。
import Injectable from '@angular/core';
import
HttpRequest,
HttpHandler,
HttpEvent,
HttpInterceptor, HttpResponse
from '@angular/common/http';
import Observable from 'rxjs';
@Injectable()
export class TokenInterceptor implements HttpInterceptor
constructor()
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>
request = request.clone(
setHeaders:
Authorization: `$localStorage.getItem('token_type') $localStorage.getItem('jwt_token')`
);
return next.handle(request);
在 app.module.ts 中添加提供者 provide: HTTP_INTERCEPTORS, useClass: TokenInterceptor, multi: true
【讨论】:
【参考方案2】:谢谢,是的,我有一个像这样的拦截器,它保存在本地存储中,但是如果我在另一个组件中,并且我想调用它,例如我按下一个按钮,并且在我想做的方法中,一个帖子,如果你按下这个按钮,你必须登录好吗?,你必须更新数据库,所以我需要知道谁按下了这个,如何找回这个?
【讨论】:
以上是关于关于 Angular 中的 AuthGuard的主要内容,如果未能解决你的问题,请参考以下文章
httpOnly cookie 中的 JWT - AuthGuard 和受保护的路由(Node.js、Angular)
“没有 AuthGuard 的提供者!”在 Angular 2 中使用 CanActivate
带有用户角色参数的 Angular2 路由 canActivate 和 AuthGuard (JWT)
退出时未调用Angular AuthGuard CanActivate - Firebase Auth