中间件、守卫、拦截器与认证

22 阅读2分钟

image.png

  • 中间件 → 负责最外层的请求处理,比如日志;

  • 守卫 → 决定“是否允许”继续执行;

  • 拦截器 → 对请求/响应进行包装;

  • 控制器 & 服务 → 处理实际的业务逻辑。

中间件

image.png 这里的中间件作用是提取请求方法和URL记录请求开始时间它在路由处理前被调用,接着计算请求处理耗时然后输出格式化的日志信息。最后还需要调用 next() 将控制权传递给下一个中间件或路由处理器,不然流程会被一直挂起。

image.png

中间件像请求前的“门卫” ,只能处理请求前或响应结束后的操作,无法直接修改 Controller 返回值

守卫

Guard(守卫)是一种用于保护路由端点的机制。类似于中间件,在请求到达路由处理程序之前,Guard 可以对请求进行拦截并在特定条件下允许或拒绝请求。

例如在这里我对身份权限做出了限制,只有role为admin的用户可以对账号的密码进行修改。

image.png

image.png

当我使用普通账号时,guard会拒绝访问路由 image.png

下面是admin账号进行密码修改,显示成功

image.png

拦截器

  • 拦截器能够在全局、Controller 级别或方法级别被使用

  • 拦截器在请求前执行逻辑 → 调用 next.handle() 执行 Controller → 在响应后执行 tap() 的逻辑

image.png

将拦截器放在单个路由前用于测试:

image.png

作用:记录请求开始/结束、耗时,方便调试和性能分析

image.png

拦截器像请求前后的“管家”,能在 Controller 前后执行逻辑,能修改返回值或做额外处理

JWT

首先通过login接口得到username,password,role生成的token image.png

当用户请求受保护的路由时:

image.png

JwtAuthGuard

  • 自动调用 JWT 策略 (JwtStrategy)
  • 拦截请求,提取请求头中的 token

jwt.strategy

  • jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken() → 提取 Bearer token

  • secretOrKey 校验 token 签名是否合法

  • 校验通过 → 调用 validate(payload) 方法

  • validate() 返回对象(例如 { userId, username, role }),被附加到 req.user

image.png

Swaager

image.png

image.png

@ApiTags - 接口分组标签

image.png

@ApiBearerAuth - 需要Bearer Token认证

image.png