- Swagger UI:http://localhost:8790/swagger-ui/index.html
- Knife4j UI:http://localhost:8790/doc.html
- API Doc:http://localhost:8790/v3/api-docs
默认有:
- 超级管理员角色,角色编码
superAdmin。 - 超级管理员用户,所属角色为超级管理员,用户名
superAdmin,密码123。
超级管理员登录系统后,可以创建:
- 【角色管理】创建角色名
租户管理员,角色编码tenantAdmin。 - 【租户管理】创建租户名
租户1。 - 【部门管理】创建部门名
租户1-总部。 - 【用户管理】创建用户昵称
租户1管理员,用户名tenant1Admin,所属角色租户管理员,部门租户1-总部,租户租户1。
租户1管理员登录系统后,可以创建:
- 【部门管理】创建部门名
租户1-部门1、租户1-部门2和子部门租户1-部门2子部门。 - 【角色管理】创建角色:
- 角色名
租户1全部,角色编码tenant1All,数据权限全部。 - 角色名
租户1自定义,角色编码tenant1Custom:- 查询数据权限:
自定义,选租户1-部门1、租户1-部门2,不包含子部门。 - 增删改数据权限:
自定义,选租户1-部门2,不包含子部门。
- 查询数据权限:
- 角色名
租户1本部门及以下,角色编码tenant1CurrentDeptAndChildren,数据权限本部门及以下。 - 角色名
租户1本部门,角色编码tenant1CurrentDept,数据权限本部门。 - 角色名
租户1仅本人,角色编码tenant1OnlySelf,数据权限仅本人。
- 角色名
- 【用户管理】创建用户:
- 昵称
租户1用户(全部),用户名tenant1AllUser,所属角色租户1全部,部门租户1-部门2子部门。 - 昵称
租户1用户(自定义),用户名tenant1CustomUser,所属角色租户1自定义,部门租户1-部门1。 - 昵称
租户1用户(本部门及以下),用户名tenant1CurrentDeptAndChildrenUser,所属角色租户1本部门及以下,部门租户1-部门2。 - 昵称
租户1用户(本部门),用户名tenant1CurrentDeptUser,所属角色租户1本部门,部门租户1-部门2。 - 昵称
租户1用户(仅本人),用户名tenant1OnlySelfUser,所属角色租户1仅本人,部门租户1-部门1。
- 昵称
- 【测试数据管理】创建测试数据(共5条):
- 值
数据-总部,归属部门租户1-总部,创建人tenant1Admin。 - 值
数据-部门1-管理员创建,归属部门租户1-部门1,创建人tenant1Admin。 - 值
数据-部门1-仅本人创建,归属部门租户1-部门1,创建人tenant1OnlySelfUser(关键数据)。 - 值
数据-部门2,归属部门租户1-部门2,创建人tenant1Admin。 - 值
数据-部门2子部门,归属部门租户1-部门2子部门,创建人tenant1Admin。
- 值
测试数据拦截:
- 登录
superAdmin(超级管理员):- 查询结果:查看所有 5 条数据。
- 新增结果:可以在 任意部门 创建数据。
- 增删改结果:可以修改/删除所有 5 条数据。
- 原因:拥有最高权限(
StpExtUtil.isSuperAdmin),拦截器和校验逻辑直接放行,无视租户和数据范围限制。
- 登录
tenant1Admin(租户管理员):- 查询结果:查看所有 5 条数据。
- 新增结果:可以在 任意部门 创建数据。
- 增删改结果:可以修改/删除所有 5 条数据。
- 原因:作为租户管理员,权限配置为“全部数据权限”,校验逻辑放行所有部门。
- 登录
tenant1AllUser(全部权限):- 查询结果:查看所有 5 条数据。
- 新增结果:可以在 任意部门 创建数据。
- 增删改结果:可以修改/删除所有 5 条数据。
- 原因:角色权限为“全部”,校验逻辑允许在租户下任意部门操作。
- 登录
tenant1CustomUser(自定义权限:查部门1+2,改仅部门2):- 查询结果:查看 3 条数据(
数据-部门1-管理员创建、数据-部门1-仅本人创建、数据-部门2)。 - 新增结果:
- 在
租户1-部门2新增:成功。 - 在
租户1-部门1新增:失败(抛出异常:“无权在所选部门操作数据”)。
- 在
- 增删改结果:
- 修改
数据-部门2:成功。 - 修改
数据-部门1-管理员创建:失败(提示“无增删改权限”)。
- 修改
- 原因:
- 查询:Query 权限覆盖了
部门1和部门2。 - 新增/修改:Update 权限仅勾选了
部门2。Service 层保存前校验的是 Update 权限,SQL 拦截器也是注入 Update 权限,严格实现了读写分离。
- 查询:Query 权限覆盖了
- 查询结果:查看 3 条数据(
- 登录
tenant1CurrentDeptAndChildrenUser(本部门及以下,所在部门:部门2):- 查询结果:查看 2 条数据(
数据-部门2、数据-部门2子部门)。 - 新增结果:可以在
租户1-部门2和租户1-部门2子部门新增;在其他部门新增失败。 - 增删改结果:可以修改/删除这 2 条数据。
- 原因:权限范围包含本部门(部门2)及其子部门,操作范围严格限制在该树形结构内。
- 查询结果:查看 2 条数据(
- 登录
tenant1CurrentDeptUser(本部门,所在部门:部门2):- 查询结果:仅查看 1 条数据(
数据-部门2)。 - 新增结果:仅可以在
租户1-部门2新增;在子部门或其他部门新增失败。 - 增删改结果:仅可以修改/删除这 1 条数据。
- 原因:严格限制为本部门,自动排除子部门数据。
- 查询结果:仅查看 1 条数据(
- 登录
tenant1OnlySelfUser(仅本人,所在部门:部门1):- 查询结果:仅查看 1 条数据(
数据-部门1-仅本人创建)。 - 新增结果:可以在
租户1-部门1新增(通常限制为当前所在部门);在其他部门新增失败。 - 增删改结果:
- 修改
数据-部门1-仅本人创建:成功。 - 修改
数据-部门1-管理员创建:失败。
- 修改
- 原因:
- 新增:允许在自己所属部门创建数据。
- 改/查:严格按
created_by = 当前用户过滤,只能操作自己的数据。
- 查询结果:仅查看 1 条数据(
权限覆盖矩阵(操作范围):
| 登录用户 | 角色权限类型 | 查询范围 (SELECT) | 新增/修改范围 (INSERT/UPDATE) | 读写分离体现 |
|---|---|---|---|---|
| superAdmin | 超级管理员 | 全部 | 全部 | 无 |
| tenant1Admin | 租户管理员 | 全部 | 全部 | 无 |
| tenant1All | 全部 | 全部 | 全部 | 无 |
| tenant1Custom | 自定义(读写分离) 查:部1,2; 改:部2 |
部门1 + 部门2 | 仅 部门2 | ✅ 只能读部1,不能写部1 |
| DeptAndChild | 本部门及以下 | 部门2 + 子部门 | 部门2 + 子部门 | 无 |
| DeptOnly | 本部门 | 仅 部门2 | 仅 部门2 | 无 |
| OnlySelf | 仅本人 | 仅 部门1 (且本人创建) | 仅 部门1 (且本人创建) | 无 |








