Nest.js 授权验证的方法示例

yizhihongxing

让我来给您详细讲解关于 "Nest.js 授权验证的方法示例" 的完整攻略。

标准安装

首先,需要使用 npm 安装 nestjs 官方授权验证库:

npm i @nestjs/passport @nestjs/jwt passport-jwt

安装了该插件后,我们还需要为它配置启用策略和秘钥等信息。例如:

// auth.module.ts

import { Module } from '@nestjs/common';
import { PassportModule } from '@nestjs/passport';
import { JwtModule } from '@nestjs/jwt';
import { JwtStrategy } from './jwt.strategy';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';

@Module({
  imports: [
    PassportModule.register({ defaultStrategy: 'jwt' }),
    JwtModule.register({
      secret: 'SECRET_KEY',
      signOptions: { expiresIn: '86400s' },
    }),
  ],
  providers: [AuthService, JwtStrategy],
  controllers: [AuthController],
  exports: [PassportModule, JwtModule],
})
export class AuthModule {}

JwtModule.register() 中设置了秘钥以及过期时间。在 PassportModule.register() 指定了默认的策略为 jwt,并且在后续请求中将会自动执行策略。

然后,我们需要创建 JwtStrategy 文件并且声明为 PassportModule 的提供者供 AuthGuard 直接调用:

// jwt.strategy.ts

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

@Module({
  providers: [JwtStrategy],
})
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: 'SECRET_KEY',
    });
  }

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

JwtStrategy 中,我们使用 passport-jwt 包来验证 JWT 令牌,并且提供了一个 validate() 方法来验证 JWT 的有效性。该方法会自动将JWT的payload属性返回,以便下一步处理该信息。

当Token 通过 jwt 策略被验证,系统会自动调用 validate() 方法,返回一个对象,其中包含用户的信息。

示例1:授权Token并验证用户信息

接下来,我们简单介绍一下如何在系统中授权Token并且验证用户信息。

首先,在 auth.service.ts 文件中,我们需要创建一个用于授权用户的方法 signIn()

// auth.service.ts

import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { UserService } from '../user/user.service';
import { User } from '../user/user.entity';

@Injectable()
export class AuthService {
  constructor(
    private readonly userService: UserService,
    private readonly jwtService: JwtService,
  ) {}

  async signIn(user: User) {
    const payload = { username: user.username, sub: user.userId };
    return {
      access_token: this.jwtService.sign(payload),
    };
  }

  async validateUser(username: string, password: string): Promise<any> {
    const user = await this.userService.findOne(username);
    if (user && user.password === password) {
      const { password, ...result } = user;
      return result;
    }
    return null;
  }
}

该方法会创建一个 JWT token 并且返回给用户。并且注意,我们需要在头部注入 Authorization:Bearer "access_token" 来启用授权策略并且默认为JWT策略。

接下来,创建一个 protected 的路由:

// cats.controller.ts

import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { CatsService } from './cats.service';
import { Cat } from './cat.entity';

@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @UseGuards(AuthGuard('jwt'))
  @Get()
  async findAll(): Promise<Cat[]> {
    return this.catsService.findAll();
  }
}

在代码中,@UseGuards(AuthGuard('jwt')) 会验证请求头是否包含 JWT token,如果是则自动将 payload 属性返回给 JwtStrategy。在这种情况下,我们在请求中访问的每个路由都会首先执行 'jwt' 策略来验证其有效性。

示例2: 权限守卫

以上示例主要用于授权并且自动验证用户信息。下面,我们会介绍一下如何使用 Permissions 守卫来进行更复杂的 “角色身份验证” 实现身份验证。

// roles.guard.ts

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';

@Injectable()
export class RolesGuard implements CanActivate {
  constructor(private readonly reflector: Reflector) {}

  canActivate(context: ExecutionContext): boolean {
    const roles = this.reflector.get<string[]>('roles', context.getHandler());
    if (!roles) {
      return true;
    }
    const request = context.switchToHttp().getRequest();
    const user = request.user;
    const hasRole = () =>
      user.roles.some(role => roles.indexOf(role) !== -1);
    return user && user.roles && hasRole();
  }
}

在上面的代码中,我们首先从请求中获取 roles 参数,并检查 user.roles 中是否有相应的角色。如果存在且匹配成功,则返回 true

// cats.controller.ts

import { Controller, Get, UseGuards, SetMetadata } from '@nestjs/common';
import { RolesGuard } from '../roles/roles.guard';
import { Cat } from './cat.entity';
import { CatsService } from './cats.service';
import { Roles } from '../roles/roles.decorator';

@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @UseGuards(RolesGuard)
  @Roles('admin')
  @Get()
  async findAll(): Promise<Cat[]> {
    return this.catsService.findAll();
  }
}

在执行例子 2 时,我们在路由中使用了 @Roles('admin) 守卫。在守卫中,我们将user对象与角色名称进行比较。如果请求不包含admin权限,则返回403 Forbidden错误。

以上就是关于 Nest.js 授权验证的方法示例攻略的详细讲解,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Nest.js 授权验证的方法示例 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • node异步方法的异步调用与同步调用实现方法示例

    来详细讲解一下“node异步方法的异步调用与同步调用实现方法示例”。 什么是Node异步方法 Node.js 采用的单线程模型,主线程负责接收客户端请求和处理返回结果等操作,而后台处理任务则交由其他线程来执行。这就涉及到了异步调用和同步调用的问题。Node.js 中一般用回调函数来实现异步调用,虽然这样代码不太好看,但是能够提高代码的执行效率。 异步调用 在…

    node js 2023年6月8日
    00
  • 命令行批量截图Node脚本示例代码

    来分享一下命令行批量截图Node脚本的完整攻略。 简介 有时候我们需要在网站上批量截取图片,例如某个网站上有大量图标,需要逐个下载,这时候手动截图就会变得非常繁琐。如果使用Node.js编写一个命令行脚本,就可以轻松实现批量截屏。 安装及使用 安装Node.js 下载并安装合适版本的 Node.js。 安装ChromeHeadless ChromeHeadl…

    node js 2023年6月8日
    00
  • webpack打包、编译、热更新Node内存不足问题解决

    下面我来详细讲解一下关于“webpack打包、编译、热更新Node内存不足问题解决”的完整攻略。本文将分为以下几个步骤: 了解webpack打包、编译、热更新的原理 解决Node内存不足问题 1. 了解webpack打包、编译、热更新的原理 1.1 webpack打包原理 webpack是一个模块打包工具,可以将多个模块按照一定的顺序打包成一个或多个文件。w…

    node js 2023年6月8日
    00
  • 实例详解AngularJS实现无限级联动菜单

    实现无限级联动菜单的步骤 第一步:引入AngularJS 在HTML文件中引入AngularJS库,可以使用CDN或者下载本地文件。例如: <script src="https://cdn.bootcdn.net/ajax/libs/angular.js/1.8.2/angular.min.js"></script&gt…

    node js 2023年6月8日
    00
  • javascript 进阶篇2 CSS XML学习

    Javascript 进阶篇2 CSS XML 学习攻略 1. 学习 CSS CSS(Cascading Style Sheets)是一种用于描述网页布局和样式的语言。在学习 CSS 之前,先要了解 HTML 的基础知识,因为 CSS 主要是用来修饰 HTML 的。 以下是学习 CSS 的步骤: 学习 CSS 的基本语法 selector { propert…

    node js 2023年6月8日
    00
  • Node.js中Process.nextTick()和Process.setImmediate()的区别

    Node.js中Process.nextTick()和Process.setImmediate()都是用于异步编程的方法,它们的作用是让一些函数推迟到下一个事件循环周期执行,从而不会阻塞主线程。 下面是Process.nextTick()和Process.setImmediate()的具体区别: Process.nextTick()方法 Process.ne…

    node js 2023年6月8日
    00
  • express.js如何做mysql注入与node-mysql中防止SQL注入方法解析

    express.js是一个基于Node.js平台的Web应用程序框架,而MySQL是一种广泛使用的开源关系型数据库管理系统。在使用express.js的过程中,我们很可能要用到MySQL数据库,因此必须注意MySQL注入这个安全问题。 一、什么是MySQL注入? MySQL注入是指通过对Web表单和参数提交进行恶意操作,来攻击Web应用程序中的MySQL数据…

    node js 2023年6月8日
    00
  • Node.js 实现远程桌面监控的方法步骤

    针对“Node.js 实现远程桌面监控的方法步骤”这个主题,我将根据以下步骤给出详细的攻略: 确定项目需求,选择合适的开发框架和技术栈。 搭建基础环境,如安装Node.js和npm。 实现远程桌面监控的功能,可以考虑使用第三方工具或者自行封装。 搭建前端页面,结合WebSocket技术实现实时监控。 部署,将应用程序上传至服务器,并配置好相关环境。 下面我将…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部