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类,官方文档中有相应说明

目录
相关文章
|
3月前
|
数据安全/隐私保护
导航守卫有哪三种?
导航守卫有哪三种?
32 0
|
3月前
导航守卫的执行顺序
导航守卫的执行顺序
25 0
|
3月前
导航守卫+vuex学习
直白的说,导航守卫就是路由跳转过程中的一些钩子函数,这些函数能让你在跳转过程中操作一些其他的事儿的时机,这就是导航守卫。 比如最常见的登录权限验证,当用户满足条件时,才让其进入导航,否则就取消跳转,并跳到登录页面让其登录。此时可以使用路由导航来实现。 导航守卫有三种:全局的, 单个路由独享的, 组件级的。
|
3月前
|
JavaScript
vue路由导航守卫(全局守卫、路由独享守卫、组件内守卫)
vue路由导航守卫(全局守卫、路由独享守卫、组件内守卫)
110 0
|
11月前
|
JavaScript 数据安全/隐私保护
【vue】路由守卫
【vue】路由守卫
60 0
|
12月前
|
JavaScript
vue3的7种路由守卫使用大全
vue3的7种路由守卫使用大全
1364 0
|
1月前
|
JavaScript
Vue Router 路由守卫/导航守卫
Vue Router 路由守卫/导航守卫
16 0
|
9月前
导航守卫的使用
导航守卫的使用
30 0
|
3月前
|
存储 缓存 JavaScript
vue三种路由守卫详解
在 Vue 中,可以通过路由守卫来实现路由鉴权。**Vue 提供了三种路由守卫:全局前置守卫、全局解析守卫和组件内的守卫
|
3月前
|
JavaScript
Vue中的路由导航守卫有哪些?它们的执行顺序是什么?
Vue中的路由导航守卫有哪些?它们的执行顺序是什么?
127 6