跳转到内容

权限系统

接口鉴权基于权限点(permission code),而不是判断角色名称。这样新增角色时无需修改任何接口代码。

  • Python 使用 require_permission(...) 依赖。
  • Java 使用 @SaCheckPermission(...) 注解(支持 SaMode.OR)。

共 32 个权限码,分为 9 个菜单权限与 23 个操作权限。完整的权限码目录见权限码。

菜单权限(9 个):dashboard、users、roles、permissions、menus、settings、ai_models、audit_logs、data_management。

操作权限(23 个):users.create、users.edit、users.delete、users.assign_role、roles.create、roles.edit、roles.delete、permissions.create、permissions.edit、permissions.delete、menus.create、menus.edit、menus.delete、menus.reorder、settings.edit、ai_models.create、ai_models.edit、ai_models.delete、ai_models.presets.create、ai_models.presets.edit、ai_models.presets.delete、data_management.export、data_management.import。

菜单权限必须通过菜单管理创建或由内置菜单目录同步。普通权限接口不会创建或删除菜单权限,以避免只有鉴权记录、没有侧边栏展示元数据的状态。

角色 ID 名称 权限
admin 管理员 全部权限码
user 普通用户 仅 dashboard、users、settings
pending_review 待审核 无

三个角色均为预设角色(is_preset),预设角色不可删除。

admin 同时通过两种方式获得全部权限:种子数据直接写入,以及每次启动时同步补齐;运行时对 admin 角色还会直接返回全部权限码。

启动时会将代码中的权限目录(Python 的 permissions_catalog.py、Java 的 PermissionCatalog)与数据库同步,自动补齐 admin 缺失的权限。因此新增权限码后重启后端即可生效。

也可以在权限管理页手动触发同步(POST /api/permissions/sync)。

用户与角色接口内置以下约束:

  • 创建或更新用户时,若分配的是非默认角色,必须额外拥有 users.assign_role 权限。
  • 不能修改自己的角色。
  • 非管理员不能修改或删除管理员账号。
  • 不能删除最后一个管理员。
  • 批量改角色会跳过自己和受保护的管理员账号。
  • 前端根据权限点过滤菜单,没有对应权限就隐藏入口。
  • 后端才是权威:即使前端隐藏了入口,越权请求仍会被 403 拒绝,并记录审计日志。