# PocketBase Collection 权限总览

> 范围：当前仓库 `docs/pb_tbl_*.md` 已存在表结构文档 + 本次新增的 3 张方案相关草案表
> 目标：把“每张表该如何做 PocketBase 原生权限控制”整理成一份便于确认、评审和后续写脚本的总览
> 状态：`working draft`

## 阅读说明

- 本文档分为“现状规则”和“本次新增建议规则”两部分。
- “现状规则”优先参考现有 `docs/pb_tbl_*.md` 与 `script/pocketbase*.js`。
- “新增建议规则”对应你这次要加的 3 张表，当前仅为文档设计，尚未执行。
- 本文所有 owner 行级规则都默认使用 `@request.auth.openid` 作为业务身份锚点。
- 软删除约定统一为：`is_delete = 0` 才视为可见、可操作数据。

## 一、推荐统一规则模板

### 1. owner 私有数据表

适用场景：

- 购物车
- 订单
- 本次新增的方案 / 方案分享 / 方案模板

推荐模板：

| Rule | 推荐表达式 |
| :--- | :--- |
| `listRule` | `@request.auth.id != "" && <owner_field> = @request.auth.openid && is_delete = 0` |
| `viewRule` | `@request.auth.id != "" && <owner_field> = @request.auth.openid && is_delete = 0` |
| `createRule` | `@request.auth.id != "" && @request.body.<owner_field> = @request.auth.openid` |
| `updateRule` | `@request.auth.id != "" && <owner_field> = @request.auth.openid && is_delete = 0` |
| `deleteRule` | `@request.auth.id != "" && <owner_field> = @request.auth.openid && is_delete = 0` |

### 2. 公开可读、管理写

适用场景：

- 字典
- 产品
- 文档
- 附件

典型模式：

| Rule | 推荐表达式 |
| :--- | :--- |
| `listRule` | `is_delete = 0` |
| `viewRule` | `is_delete = 0` |
| `createRule` | `@request.auth.users_idtype = "ManagePlatform" \|\| @request.auth.usergroups_id = "<管理角色ID>"` |
| `updateRule` | `@request.auth.users_idtype = "ManagePlatform" \|\| @request.auth.usergroups_id = "<管理角色ID>"` |
| `deleteRule` | `@request.auth.users_idtype = "ManagePlatform" \|\| @request.auth.usergroups_id = "<管理角色ID>"` |

### 3. 管理/权限元数据表

适用场景：

- 角色
- 资源
- 角色权限
- 用户覆盖权限
- 行级范围
- 文档操作历史

典型模式：

- 默认不建议公开给普通用户直接访问。
- 推荐仅管理端 / 管理角色通过 hooks 页面或内部脚本维护。

## 二、现有表规则总表

## 2.1 owner 私有数据

| 表名 | owner 字段 | list/view | create | update/delete | 说明 |
| :--- | :--- | :--- | :--- | :--- | :--- |
| `tbl_cart` | `cart_owner` | `@request.auth.id != "" && cart_owner = @request.auth.openid && is_delete = 0` | `@request.body.cart_owner != ""` | `@request.auth.id != "" && cart_owner = @request.auth.openid` | 已在 `script/pocketbase.cart-order.js` 明确；当前 create 已放宽为只要显式提交非空 owner 即可 |
| `tbl_order` | `order_owner` | `@request.auth.id != "" && order_owner = @request.auth.openid && is_delete = 0` | `@request.auth.id != "" && @request.body.order_owner = @request.auth.openid` | `@request.auth.id != "" && order_owner = @request.auth.openid` | 已在 `script/pocketbase.cart-order.js` 明确 |

## 2.2 公开可读、管理写

| 表名 | list/view | create/update/delete | 说明 |
| :--- | :--- | :--- | :--- |
| `tbl_system_dict` | `is_delete = 0` | `ManagePlatform` 或管理角色 | `script/pocketbase.dictionary.js` 已明确 |
| `tbl_product_list` | `is_delete = 0` | `ManagePlatform` 或管理角色 | `script/pocketbase.product-list.js` 已明确 |
| `tbl_document` | `is_delete = 0` | 文档当前脚本未显式开放原生写；实际业务通过 hooks 管理端写入 | `script/pocketbase.documents.js` + 现有文档口径 |
| `tbl_attachments` | `is_delete = 0` | 原生写默认不开放，实际通过 hooks / 管理端上传 | `script/pocketbase.documents.js` + 现有文档口径 |

## 2.3 管理端/权限模型表

| 表名 | 当前口径 | 说明 |
| :--- | :--- | :--- |
| `tbl_auth_resources` | 管理用途，不建议公开给普通用户直连 | 现有文档写为“仅管理员 / 管理角色允许” |
| `tbl_auth_roles` | 管理用途，不建议公开给普通用户直连 | 同上 |
| `tbl_auth_role_perms` | 管理用途，不建议公开给普通用户直连 | 同上 |
| `tbl_auth_user_overrides` | 管理用途，不建议公开给普通用户直连 | 同上 |
| `tbl_auth_row_scopes` | 管理用途，不建议公开给普通用户直连 | 同上 |
| `tbl_document_operation_history` | 管理用途，不建议公开给普通用户直连 | 同上 |

## 2.4 特殊表

| 表名 | 当前口径 | 备注 |
| :--- | :--- | :--- |
| `tbl_auth_users` | 当前文档口径为“公开允许新增与修改；列表 / 详情 / 删除仅管理员 / 管理角色允许” | 这是 auth collection，既受 PB auth 机制影响，也受 hooks 认证流程影响 |
| `tbl_company` | 当前文档口径为“公开可创建、公开可列出；详情 / 更新 / 删除仅管理员或管理后台用户允许” | 更偏业务接入表，不属于 owner 私有表 |

## 三、本次新增 3 表建议规则

| 表名 | owner 字段 | list/view | create | update/delete | 备注 |
| :--- | :--- | :--- | :--- | :--- | :--- |
| `tbl_scheme` | `scheme_owner` | `@request.auth.id != "" && scheme_owner = @request.auth.openid && is_delete = 0` | `@request.auth.id != "" && @request.body.scheme_owner = @request.auth.openid` | `@request.auth.id != "" && scheme_owner = @request.auth.openid && is_delete = 0` | 私有方案表 |
| `tbl_scheme_share` | `scheme_share_owner` | `@request.auth.id != "" && scheme_share_owner = @request.auth.openid && is_delete = 0` | `@request.auth.id != "" && @request.body.scheme_share_owner = @request.auth.openid` | `@request.auth.id != "" && scheme_share_owner = @request.auth.openid && is_delete = 0` | 按你的要求，分享表也采用 owner 私有规则，因此接收方默认不能直连查看 |
| `tbl_scheme_template` | `scheme_template_owner` | `@request.auth.id != "" && scheme_template_owner = @request.auth.openid && is_delete = 0` | `@request.auth.id != "" && @request.body.scheme_template_owner = @request.auth.openid` | `@request.auth.id != "" && scheme_template_owner = @request.auth.openid && is_delete = 0` | 私有模板表 |

## 四、这次设计里需要你重点确认的点

### 1. `tbl_scheme_share` 是否接受新增 `scheme_share_owner`

这是本次最关键的结构补充。

原因：

- 你要求 3 张表统一按 `xxx_owner = token 对应 openid` 做 PB 行级限制。
- 原始草图里的分享表没有 owner 字段，无法直接套用这套规则。

如果你确认这条设计，后续脚本会把它作为正式字段创建。

### 2. `createRule` 是否必须校验 `@request.body.<owner_field> = @request.auth.openid`

当前文档建议“要校验”。

原因：

- 这样可以防止普通用户伪造别人的 owner 值直接创建越权数据。
- 这也是现有 `tbl_cart` / `tbl_order` 的做法，风格一致。

### 3. 分享表是否允许“被分享人”直接走 PB 原生 API 查看

当前文档按你的要求，先设计成：

- 只有 `scheme_share_owner` 能删改查

这最严格，但也意味着：

- `scheme_share_to` 对应的用户不能直接通过 PB 原生 `list/view` 看到分享记录

如果你的实际业务是“被分享人需要能直接看到收到的分享”，那这张表的 `listRule` / `viewRule` 需要改成双边可见，而不是纯 owner 模式。

## 五、对应文档索引

- [pb_tbl_scheme.md](/E:/Project_Class/BAI/Web_BAI_Manage_ApiServer/docs/pb_tbl_scheme.md)
- [pb_tbl_scheme_share.md](/E:/Project_Class/BAI/Web_BAI_Manage_ApiServer/docs/pb_tbl_scheme_share.md)
- [pb_tbl_scheme_template.md](/E:/Project_Class/BAI/Web_BAI_Manage_ApiServer/docs/pb_tbl_scheme_template.md)
