最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nestjs自定義注解實現(xiàn)接口權(quán)限控制詳解

 更新時間:2022年12月05日 17:26:05   作者:solocoder  
這篇文章主要為大家介紹了Nestjs自定義注解實現(xiàn)接口權(quán)限控制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

當(dāng)業(yè)務(wù)接口開發(fā)完成之后,正式上線之前還需要對每個接口進行權(quán)限控制。比如刪除用戶只能管理員角色操作,查詢?nèi)坑脩糁挥泄芾韱T有權(quán)限等。

對接口實現(xiàn)權(quán)限控制有很多種方案,最簡單的實現(xiàn)是在每個接口的 controller 層進行判斷,但這樣不優(yōu)雅,冗余代碼多,且對業(yè)務(wù)侵入比較強。合理的權(quán)限控制方案應(yīng)該是跟業(yè)務(wù)邏輯松耦合。

Nest 官方文檔為我們提供了幾種權(quán)限控制方式,我們來實現(xiàn)最基礎(chǔ)的基于角色的 RBAC(Role-based access control) 控制方案。

實現(xiàn) RBAC 權(quán)限控制一共需要五步:

  • 定義角色的枚舉類 Role
  • 聲明自定義注解(裝飾器)roles.decorators.ts
  • 實現(xiàn)角色守衛(wèi) RolesGuard
  • 在 app.module.ts 的 providers 中引入 RolesGuard
  • 在需要的接口上添加注解:@Roles(Role.Admin, Role.SuperAdmin)?

定義角色枚舉

梳理好系統(tǒng)中一共有多少種角色,并為每種角色確定好 Code,然后聲明為枚舉類型。這里的角色類型可以自定義,根據(jù)業(yè)務(wù)需要設(shè)多少都行。

export enum Role {
  SuperAdmin = 'SuperAdmin',
  Admin = 'Admin',
  Normal = 'Normal',
  Guest = 'Guest',
}

聲明自定義注冊(裝飾器)

新建一個 roles.decorator.ts文件,就可以在 Controller 中使用 @Roles注解了

import { SetMetadata } from '@nestjs/common';
import { Role } from '@constants';
export const ROLES_KEY = 'roles';
export const Roles = (...roles: Role[]) => SetMetadata(ROLES_KEY, roles);

實現(xiàn)角色守衛(wèi) RolesGuard

新建 roles.gurad.ts文件,它的作用是告訴 nest 什么情況下請求應(yīng)該被攔截,什么情況下請求應(yīng)該被通過。

通過 reflector可以拿到注解中傳入的角色 code 列表,通過 context.switchToHttp().getRequest()可以拿到 request 對象。因為我們使用了 jwt,在 JwtStrategy?中往 user 對象中寫入了當(dāng)前登錄用戶的角色信息,所以可以通過從 request 中取 user 的方式得到角色列表。這塊具體的獲取方式根據(jù)你的業(yè)務(wù)而定,業(yè)務(wù)中把角色信息放在了什么地方,就從哪里取。

拿到注解中傳入的角色,和用戶已有的角色進行對比,如果用戶角色中包含需要的角色,則返回 true,如果返回 false,則會拋出默認的異常如下:

{
  "statusCode": 403,
  "message": "Forbidden resource",
  "error": "Forbidden"
}

我們需要定制錯誤信息,以使整個系統(tǒng)保持一致,則拋出一個自定義異常,這個異常按照統(tǒng)一規(guī)定的格式返回錯誤信息。

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { ROLES_KEY } from '../decorators/roles.decorator';
import { Role } from '@constants';
import { InternalErrorException } from '../../exception/InternalErrorException';
import { errorResult } from '@utils';
import { ErrorCodes } from '@constants/errorCode';
@Injectable()
export class RolesGuard implements CanActivate {
  constructor(private reflector: Reflector) {}
  canActivate(context: ExecutionContext): boolean {
    const requiredRoles = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
      context.getHandler(),
      context.getClass(),
    ]);
    if (!requiredRoles) {
      return true;
    }
    const { user } = context.switchToHttp().getRequest();
    const roleCodes = user.roles?.map((item) => item.code);
    const flag = requiredRoles.some((role) => roleCodes?.includes(role));
    if (!flag) {
      throw new InternalErrorException(errorResult(ErrorCodes.NoAuth));
    }
    return flag;
  }
}

在 providers 中引入 RolesGuard

如果想在全局使用自定義注解,就在 app.module.ts中全局引入。如果僅想在某個 controller 中使用,則在這個 controller 層級的 module 中聲明。

providers: [
  {
    provide: APP_GUARD,
    useClass: RolesGuard,
  },
],

使用注解

在接口上使用自定義注解實現(xiàn)權(quán)限校驗。
括號里可以寫一個權(quán)限,也可以寫多個,因為我們 roles.decorator.ts中寫的參數(shù)類型為 Role[]

  @Get()
  @Roles(Role.Admin, Role.SuperAdmin)
  async findAll() {
    const users = await this.userService.findAll();
    return successResult(users);
  }

至此,使用自定義注冊實現(xiàn)接口權(quán)限控制就完成啦。

以上就是Nestjs自定義注解實現(xiàn)接口權(quán)限控制詳解的詳細內(nèi)容,更多關(guān)于Nestjs注解接口權(quán)限的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • require加載器實現(xiàn)原理的深入理解

    require加載器實現(xiàn)原理的深入理解

    這篇文章主要給大家介紹了關(guān)于require加載器實現(xiàn)原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • koa2上傳文件及https配置實現(xiàn)教程

    koa2上傳文件及https配置實現(xiàn)教程

    這篇文章主要為大家介紹了koa2上傳文件及https配置實現(xiàn)教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • node中使用es5/6以及支持性與性能對比

    node中使用es5/6以及支持性與性能對比

    本篇文章主要介紹了node中使用es5/6以及支持性與性能對比,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 在node.js中讀寫文件的三種方法總結(jié)

    在node.js中讀寫文件的三種方法總結(jié)

    nodejs中所有與文件相關(guān)的操作都在fs模塊中,而讀寫操作又是我們會經(jīng)常用到的操作,nodejs的fs模塊針對讀操作為我們提供了readFile,read, createReadStream三個方法,接下來小編就和大家一起來分析一下這三種方法
    2023-09-09
  • Node.js API詳解之 console模塊用法詳解

    Node.js API詳解之 console模塊用法詳解

    這篇文章主要介紹了Node.js API詳解之 console模塊用法,總結(jié)分析了Node.js API中console模塊基本函數(shù)、使用方法與操作注意事項,需要的朋友可以參考下
    2020-05-05
  • 在Ubuntu系統(tǒng)上安裝Ghost博客平臺的教程

    在Ubuntu系統(tǒng)上安裝Ghost博客平臺的教程

    這篇文章主要介紹了在Ubuntu系統(tǒng)上安裝Ghost博客平臺的教程,Ghost博客平臺以Node.js寫成,需要的朋友可以參考下
    2015-06-06
  • express框架+bootstrap美化ejs模板實例分析

    express框架+bootstrap美化ejs模板實例分析

    這篇文章主要介紹了express框架+bootstrap美化ejs模板,結(jié)合實例形式分析了express框架引入bootstrap結(jié)合ejs模版引擎相關(guān)操作技巧與注意事項,需要的朋友可以參考下
    2023-05-05
  • package.json各個屬性說明詳解

    package.json各個屬性說明詳解

    這篇文章主要介紹了package.json各個屬性說明詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • node實現(xiàn)shell命令管理工具及commander.js學(xué)習(xí)

    node實現(xiàn)shell命令管理工具及commander.js學(xué)習(xí)

    這篇文章主要為大家介紹了node實現(xiàn)shell命令管理工具及commander.js學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • node schedule實現(xiàn)定時任務(wù)的示例代碼

    node schedule實現(xiàn)定時任務(wù)的示例代碼

    實際工作中,可能會遇到定時清除某個文件夾內(nèi)容,本文主要介紹了node schedule實現(xiàn)定時任務(wù)的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08

最新評論

西城区| 龙州县| 桂东县| 剑河县| 柳州市| 泰安市| 鄱阳县| 桃源县| 民乐县| 乐山市| 江山市| 赤水市| 乌兰察布市| 大姚县| 镇平县| 察雅县| 黄浦区| 新化县| 东乡族自治县| 班戈县| 濉溪县| 日喀则市| 上杭县| 凤庆县| 河东区| 河源市| 裕民县| 吐鲁番市| 龙州县| 利津县| 化州市| 白玉县| 巫山县| 秭归县| 义乌市| 鞍山市| 德令哈市| 铜鼓县| 简阳市| 汝南县| 台南市|