Guard 与权限思路
这节要解决什么
学会用 Guard 保护路由,并区分「认证」和「授权」。
先用大白话
- 认证(Authentication):你是谁?(有没有合法 token)
- 授权(Authorization):你能不能干这事?(是不是资源主人 / 是不是管理员)
Nest 的 Guard 很像 Vue Router / Nuxt 的导航守卫:
进门前先查通行证,不通过就拦下。
常见写法:
@UseGuards(JwtAuthGuard)挂在控制器或方法上- 通过后把
user挂到请求上 - Controller 用装饰器取出当前用户 id,传给 Service
对着项目看
关注这些文件(名称可能略有出入,以仓库为准):
jwt.strategy.ts/jwt-auth.guard.ts:如何解析 Bearer tokenbookmarks.controller.ts:哪些接口需要登录- 自定义
@CurrentUser()装饰器:方便取当前用户
试一下:
# 不带 token → 应该 401
curl http://localhost:3000/bookmarks
# 带 token → 200
curl http://localhost:3000/bookmarks \
-H "Authorization: Bearer 粘贴你的token"再测授权:用户 A 的 token 去删用户 B 的书签 id → 应 403 或 404(项目里选择一种明确策略即可)。
实战扩展(先知道名字)
- 角色:admin / user(RBAC)
- 刷新令牌:access 短、refresh 长
- API Key:给服务与服务之间用
入门先把「登录用户 + 只能碰自己的数据」做稳,已经超过很多教程质量。
验收清单
- 能解释 Guard 和 Vue 路由守卫的相似点
- 会区分 401(没登录)和 403(没权限)
- 受保护接口在无 token 时会失败
下一节 → 练习与验收.md