21_守卫

简介: 21_守卫

守卫的主要作用是鉴权,即判断用户有没有权限访问接口中的特定服务

  1. 创建一个守卫 nest g gu role
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
// 注意Reflector是一个类,需要先在构造器的参数列表中声明
import { Reflector } from '@nestjs/core';
import { Request } from 'express';
@Injectable()
export class RoleGuard implements CanActivate {
  constructor(private Reflector:Reflector){}
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    console.log('通过了守卫')
    // 返回true代表放行,false代表拒绝
    return true
  }
  1. 在login.controller.ts里注册
import { RoleGuard } from '../role/role.guard';
import { SetMetadata } from '@nestjs/common';
@Controller('login')
export class LoginController {
  constructor(private readonly loginService: LoginService) {}
  @Get()
  // 在这里注册
  @UseGuards(RoleGuard)
  findAll() {
    return this.loginService.findAll();
  }
}

此时访问localhost:3000/login控制台就会打印'通过了守卫'

鉴权

  1. 在上文守卫的基础上使用@SetMetadata()装饰器自定义一个路由元数据,我们一会儿通过反射得到它
  2. 修改role.guard.ts
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Observable } from 'rxjs';
import { Reflector } from '@nestjs/core';
import { Request } from 'express';
@Injectable()
export class RoleGuard implements CanActivate {
  constructor(private Reflector:Reflector){}
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    // 获取刚才定义的路由元数据
    const admin = this.Reflector.get<string[]>('role',context.getHandler())
    console.log('通过了守卫',admin)
    // 获取前端请求信息
    const req = context.switchToHttp().getRequest<Request>()
    // 检查请求信息中是否包含特定字段,如有则放行
    if(admin.includes(req.query.role as string)){
      return true
    }else{
      return false
    }
  }
}

context:context实际上是一个ExecutionContext类,官方文档中有相应说明

目录
相关文章
|
7月前
|
数据安全/隐私保护
导航守卫有哪三种?
导航守卫有哪三种?
62 0
|
7月前
导航守卫+vuex学习
直白的说,导航守卫就是路由跳转过程中的一些钩子函数,这些函数能让你在跳转过程中操作一些其他的事儿的时机,这就是导航守卫。 比如最常见的登录权限验证,当用户满足条件时,才让其进入导航,否则就取消跳转,并跳到登录页面让其登录。此时可以使用路由导航来实现。 导航守卫有三种:全局的, 单个路由独享的, 组件级的。
|
JavaScript 数据安全/隐私保护
【vue】路由守卫
【vue】路由守卫
78 0
|
7月前
|
JavaScript
vue路由导航守卫(全局守卫、路由独享守卫、组件内守卫)
vue路由导航守卫(全局守卫、路由独享守卫、组件内守卫)
305 0
|
JavaScript
vue3的7种路由守卫使用大全
vue3的7种路由守卫使用大全
1460 0
|
1月前
|
前端开发 API UED
React 路由守卫 Guarded Routes
【10月更文挑战第26天】本文介绍了 React 中的路由守卫(Guarded Routes),使用 `react-router-dom` 实现权限验证、登录验证和数据预加载等场景。通过创建 `AuthContext` 管理认证状态,实现 `PrivateRoute` 组件进行路由保护,并在 `App.js` 中使用。文章还讨论了常见问题和易错点,提供了处理异步操作的示例,帮助开发者提升应用的安全性和用户体验。
50 1
|
5月前
|
JavaScript
Vue Router 路由守卫/导航守卫
Vue Router 路由守卫/导航守卫
38 0
导航守卫的使用
导航守卫的使用
46 0
|
7月前
|
存储 缓存 JavaScript
vue三种路由守卫详解
在 Vue 中,可以通过路由守卫来实现路由鉴权。**Vue 提供了三种路由守卫:全局前置守卫、全局解析守卫和组件内的守卫
|
存储 JavaScript
vuex和导航守卫
vuex和导航守卫