返回

技术专题:深入理解 NestJS 14 中的授权机制

前端

好的,我将运用自己的知识和技能,尽力撰写一篇有关 NestJS 14 - 授权的文章。

NestJS 14 中的授权机制

NestJS 14 为开发者提供了强大的授权机制,旨在帮助开发者构建安全的应用程序,更好地控制用户访问权限。授权是指进程来决定用户能做些什么。例如,允许管理员用户进行创建,编辑,和删除帖子。没有管理权限的用户只能被授权阅读帖子。授权与身份验证是正交且独立的。然而,授权需要一个身份验证机制。

NestJS 中的授权机制提供了以下主要特性:

  • 角色和权限:开发者可以使用角色和权限来定义不同用户的访问权限。角色是一种用户组,具有相同的权限集。权限是允许用户执行特定操作的许可。
  • 守卫 (Guards):守卫是一种过滤器,可以在请求到达控制器之前对其进行拦截。守卫可以用来检查用户的权限,并决定是否允许请求继续。
  • 拦截器 (Interceptors):拦截器是一种过滤器,可以在请求到达控制器之后对其进行拦截。拦截器可以用来记录请求信息、修改请求数据,或者在请求失败时进行处理。
  • 装饰器 (Decorators):装饰器是一种元数据,可以用来修饰类、方法或属性。装饰器可以用来指定路由的访问权限,或者指定控制器或方法需要哪些权限。

如何使用 NestJS 14 的授权机制

要使用 NestJS 14 的授权机制,开发者需要首先在应用程序中导入 @nestjs/auth 模块。然后,开发者需要创建一个 AuthGuard 类,该类继承自 NestAuthGuard 抽象类。在 AuthGuard 类中,开发者需要实现 canActivate 方法,该方法负责检查用户的权限,并决定是否允许请求继续。

import { Injectable } from '@nestjs/common';
import { NestAuthGuard } from '@nestjs/passport';

@Injectable()
export class JwtAuthGuard extends NestAuthGuard('jwt') {}

接下来,开发者需要创建一个 JwtStrategy 类,该类继承自 PassportStrategy 抽象类。在 JwtStrategy 类中,开发者需要实现 validate 方法,该方法负责验证 JWT 令牌,并返回用户对象。

import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: process.env.JWT_SECRET,
    });
  }

  async validate(payload: any) {
    return { userId: payload.sub, username: payload.username };
  }
}

最后,开发者需要在应用程序的 main.ts 文件中配置授权模块。

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.useGlobalGuards(new JwtAuthGuard());

  await app.listen(3000);
}

bootstrap();

结语

NestJS 14 的授权机制是一个功能强大、灵活易用的工具,可以帮助开发者构建安全的应用程序,更好地控制用户访问权限。通过使用角色、权限、守卫、拦截器和装饰器,开发者可以轻松地定义和管理用户的访问权限。