主 题
博客系统自文档 · 第 7/16 篇
目录 · 上一篇:认证与登录 · 下一篇:数据权限与机构专栏
写在前面
菜单藏页面,RBAC 藏接口。即使猜到 URL,没有 privilegeCode 也会 403。本篇是后端权限的核心——适合要扩展 API 或做 SQL patch 的开发者。
功能与体验
| 角色 | roleId | 典型能力 |
|---|---|---|
| 超级管理员 | 1 | 跳过 privilege 码检查(开发模式另有宽松规则) |
| 管理员 | 2 | 运营、审核、RPG 后台 |
| 作者 | 3 | 自己的文章 + 部分公开接口 |
C 端读者:未登录只能调 isPublic=1 的接口(文章列表、详情等);登录后多调「我的」类接口。
设计与实现
flowchart TD
Req[HTTP Request]
PG[PermissionGuard 全局]
Pub{isPublic?}
JWT{有 uid?}
Role[role_permissions Redis]
Code{privilegeCode 匹配?}
OK[200]
Deny[401/403]
Req --> PG --> Pub
Pub -->|是| OK
Pub -->|否| JWT
JWT -->|否| Deny
JWT -->|是| Role --> Code
Code -->|是| OK
Code -->|否| Deny
数据模型
privilege 表(核心字段):
| 字段 | 说明 |
|---|---|
pathPattern |
正则匹配 /article/list 等 |
httpMethod |
GET/POST/... |
privilegeCode |
如 article:list |
isPublic |
1 = 无需登录 |
requireOwnership |
是否校验资源归属 |
角色与权限:role ↔ privilege 多对多;用户 ↔ role 多对多。
Redis 缓存(约 2~5 分钟 TTL)
| Key | 内容 |
|---|---|
public_api_paths |
公开路由集合 |
api_permission_mappings |
全量 path → privilege |
role_permissions:{roleId} |
角色拥有的 code 列表 |
改 privilege SQL 后必须:redis-cli DEL public_api_paths api_permission_mappings(有时含 role_permissions:*)。
增量流程
新 Home 接口示例见 deploy/sql/patches/*-api-permissions.sql:
INSERT privilege ... WHERE NOT EXISTS- 关联角色(若需登录)
- 执行 patch + 刷 Redis
- 登记
patches/README.md
文档:deploy/菜单权限增量更新流程.md
与菜单的关系
- menu 表:admin 侧栏展示,含
filePath、国际化 key - privilege:API 能否访问
- 二者通过
privilegePage等关联,但不是同一张表
踩坑与取舍
- 先 Public 再 Login:Guard 顺序决定未登录用户能否读文章列表。
- 超级管理员仍要 JWT:只是不校验 privilegeCode,不是匿名调 admin 接口。
- C 端新路由常需 patch:Nitro
/feed.xml走 Home 内部调 list,通常已 public;新增author-stats等需专门 patch(见home-batch3-api-permissions.sql)。
系列导航
- 导读 · 第 0 篇
- 下一篇:08 数据权限与机构专栏(待写)
延伸阅读
permission.guard.tsdeploy/菜单权限增量更新流程.mddeploy/sql/patches/README.md

全部评论(0)