NestJS:RBAC 权限管理(实现思路)
模型层级
常见三张核心表(命名依项目而定):
| 实体 | 说明 |
|---|---|
| 用户(User) | 账号、密码哈希、基础资料 |
| 角色(Role) | 角色编码、名称、是否超级管理员等 |
| 权限(Permission) | 菜单 / 按钮 / API 标识(如 user:create) |
多对多关系:用户 ↔ 角色、角色 ↔ 权限;登录后签发 JWT,载荷中带 userId 或可还原的角色 / 权限列表(过大时可只带用户 ID,每次请求再查缓存)。
NestJS 落地要点
- 鉴权:
@nestjs/passport+passport-jwt校验 Token。 - 鉴权与路由绑定:全局 Guard 或控制器级
@UseGuards(JwtAuthGuard)。 - 授权:自定义 Guard 或装饰器(如
@Roles('admin')),读取 Handler 元数据,与用户权限比对。 - 注销 / 黑名单:登出将 jti / tokenId 写入 Redis 并设置 TTL,与 JWT 有效期一致;校验时查黑名单。
前端配合
- 登录后保存 Token(内存 + 持久化策略按安全等级选择)。
- 菜单与路由由后端权限列表生成,避免前端写死超级管理员菜单。
- 按钮级权限:指令或组件根据
permissions判断是否渲染。
安全提示
密码使用 bcrypt 等慢哈希;敏感接口务必 HTTPS;权限字符串需防枚举与越权(服务端最终以数据库为准)。
